2020年6月23日火曜日

【PowerShell】OpenFileDialogでフォルダ選択をする

PowerShellでフォルダやディレクトリ選択をしたい時、調べてよく出てくるのは「FolderBrowserDialog」ですよね。
ツリー表示が苦手なのとドライブの移動がフォーム上でできず困ったので、通常ファイル選択で利用する「OpenFileDialog」でフォルダ選択できるよう考えてみました。


サンプルコード


# System.Windows.Formsアセンブリを有効化
[void][System.Reflection.Assembly]::Load("System.Windows.Forms, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")

# OpenFileDialogクラスをインスタンス化し、必要な情報を設定
$dialog = New-Object System.Windows.Forms.OpenFileDialog
$dialog.InitialDirectory = "C:\"
$dialog.Title = "フォルダを選択してください"
$dialog.ValidateNames = 0 # falseに設定
$dialog.CheckFileExists = 0 # falseに設定
$dialog.CheckPathExists = 1 # trueに設定

# 常に表示されるファイル名(なんか文字数制限ある感じになってしまった・・・)
$dialog.FileName = "フォルダを選択"

# ダイアログを表示
if($dialog.ShowDialog() -eq "OK"){
  # [OK]ボタンがクリックされたら、選択されたファイル名(パス)を表示

  # 今のままだと[パス]/フォルダを選択というパスになってしまうので親要素だけを切り出し
  $folderPath =  Split-Path -Parent $dialog.FileName

  [System.Windows.Forms.MessageBox]::Show($folderPath + " が選択されました。", "できたよ")

}



すこし無理やり感があるのですがポイントは4つです。
$dialog.ValidateNames = 0 # falseに設定
$dialog.CheckFileExists = 0 # falseに設定
$dialog.CheckPathExists = 1 # trueに設定
$dialog.FileName = "フォルダを選択"

これらを書くことによりファイルが選択できなくなります。
FileNameを設定してしまっているため、返ってくるパスにFileNameがくっついてきてしまうので、フォルダパスだけを取得したいときは
$folderPath =  Split-Path -Parent $dialog.FileName
で親要素だけ取得してあげましょう。


参考
https://stackoverflow.com/questions/11624298/how-to-use-openfiledialog-to-select-a-folder
https://www.codeproject.com/Articles/44914/Select-file-or-folder-from-the-same-dialog

0 件のコメント:

コメントを投稿

【PowerShell】OpenFileDialogでフォルダ選択をする

PowerShellでフォルダやディレクトリ選択をしたい時、調べてよく出てくるのは「FolderBrowserDialog」ですよね。 ツリー表示が苦手なのとドライブの移動がフォーム上でできず困ったので、通常ファイル選択で利用する「OpenFileDialog」でフォルダ選択で...