ファイルを開くダイアログを表示する

.NET Framework の OpenFileDialog を PowerShell から作成して表示する方法を紹介します。

ファイルダイアログを開く初期ディレクトリを設定する InitialDirectory メンバは、Windowsパス区切りしか指定できません。UNIXパス区切りの場合は初期ディレクトリの設定に失敗します。

c:\tmp ならば正しく動きます。
c:/tmp だとうまく動きません。

単一のファイルを選ぶ場合は Multiselect メンバを $false にします。これはデフォルト動作です。
複数のファイルを選ぶ場合は Multiselect メンバを $true にします。

単一のファイルを選択する

[void][System.Reflection.Assembly]::LoadWithPartialName( "System.Windows.Forms" )

$ofd = New-Object System.Windows.Forms.OpenFileDialog
$ofd.Filter = "Bitmap|*.bmp|Png|*.png|Jpeg|*.jpg|All|*.*"
$ofd.InitialDirectory = "C:\tmp" #UNIX区切りでは正しく動かない.
$ofd.Title = "Open"

# 単一ファイルの選択はデフォルト動作なので明示する必要はない.
# $ofd.Multiselect = $false

# ダイアログを表示する.
$ret = $ofd.ShowDialog()

# 戻り値を評価する.
if( $ret -eq [System.Windows.Forms.DialogResult]::OK )
{
    Write-Output ( $ofd.FileName )
}
else
{
    Write-Output ( "Canceled." )
}

下記が実行結果です。

C:\tmp\this_is_08.bmp

複数のファイルを選択する

[void][System.Reflection.Assembly]::LoadWithPartialName( "System.Windows.Forms" )

$ofd = New-Object System.Windows.Forms.OpenFileDialog
$ofd.Filter = "Bitmap|*.bmp|Png|*.png|Jpeg|*.jpg|All|*.*"
$ofd.InitialDirectory = "C:\tmp" #UNIX区切りでは正しく動かない.
$ofd.Title = "Open"

# 複数選択を許可する.
$ofd.Multiselect = $true

# ダイアログを表示する.
$ret = $ofd.ShowDialog()

# 戻り値を評価する.
if( $ret -eq [System.Windows.Forms.DialogResult]::OK )
{
    # こちらは FileName's'であることに注目せよ.  
    Write-Output ( $ofd.FileNames )
}
else
{
    Write-Output ( "Canceled." )
}

下記が実行結果です。

C:\tmp\this_is_08.bmp
C:\tmp\this_is_08_ex.bmp
C:\tmp\this_is_08_exx.bmp