エクスプローラでフォルダ(ディレクトリ)を開く

フォルダ(ディレクトリ)を開くには Start-Process コマンドをつかって explorer.exe を実行します。ディレクトリのパスを与える引数は -ArgumentList オプションで与えます。

すでにフォルダが開いていたら、explorer.exe を実行せずにダイアログをポップアップさせるようにしてみました。

param (
    [string]$dirpath
)

# 対象のディレクトリが表示されていたらタイトルにパスデリミタの最後の文字列が表示されているはず.
$title = $dirpath.Split('\')[-1]

# 最後の文字列が含まれるかどうかをサーチパターンにする.
$search_ptn = "*$title*"

# explorer.exe プロセスがサーチパターンを含むディレクトリを開いているか確認する
$ret = Get-Process | Where-Object { $_.ProcessName -eq 'explorer' -and $_.MainWindowTitle -like $search_ptn }

if ( $ret ) {
    # すでに開いているというダイアログをポップアップする
    $wsobj = New-Object -ComObject WScript.Shell
    $ret = $wsobj.Popup("Folder is already open.")
} else {
    # 対象のディレクトリをエクスプローラで開く
    Start-Process explorer.exe -ArgumentList $dirpath
}

これをコマンドプロンプトから実行する場合は下記のようにします。

c:\tmp>powershell -F "./test.ps1" -dirpath "c:\abc\target"

これを PowerShell コンソールから実行するには下記のようにします。

PS C:\tmp> ./test.ps1 -dirpath "c:\abc\target"

ハマリポイント

UNIX 的なファイルパス指定をすると失敗します。最近は、パスのデリミタがバックスラッシュでも、スラッシュでも区別なく動くようになってきましたが、explorer.exe はスラッシュでは受け付けないようですね。

# パスデリミタがUNIXスラッシュだと失敗する.
c:\tmp>powershell -F "./test.ps1" -dirpath "c:/abc/target"

# パスデリミタがUNIXスラッシュだと失敗する.
PS C:\tmp> ./test.ps1 -dirpath "c:/abc/target"