今回はWindows PowerShellでファイルダイアログを表示します。なお、PowerShell Coreでは動作しません。Windows PowerShell専用です。実行する場合はISEから行ってください。今回はファイルダイアログを表示するのが目的なので何かややこしいファイル処理をしたりテキストデータを加工処理することはしません。要するに目的はファイルパスを求めることだからです。
macOSでのPowerShellでのダイアログ表示については次回説明します。ちなみにmacOSのbash,zshでもファイルダイアログを表示できます。

コマンド処理の不安

 コマンドラインからコマンドを入力して処理する場合に不安になるのが、指定したファイルパスが正しいかどうかというのがあります。パスの指定は1文字間違えただけで大変なことになってしまうことがあります。例えば./はカレントディレクトリを示しますが、/ならルートディレクトリを示します(Windowsは環境によって¥または\記号になります。PowerShellでは/,¥,\のいずれも使えます)。このためカレントディレクトリ以下のファイル等を消すために

rm -rf ./

と入力するはずが間違えて.の入力を忘れるとルートディレクトリ以下を消す指定になってしまいます。

rm -rf /

大昔は指定を間違えるとルートディレクトリ以下をまるごと消してしまうということもありましたが、今のOSでは簡単にはルートディレクトリを消すようなことはできなくなっています。ですので、上記コマンドを入力してもルートディレクトリは簡単には消えません。

ファイルを消す以外にも不安要素というか困る場合もあります。特にワイルドカード/正規表現などでうまくピックアップ(選択)できないファイルを処理するような場合です。つまり規則性がないファイル名のファイルを処理したい場合などです。このような場合は別途処理するファイルリストを用意しておき、それを読み込んで処理させたりする方法があります。とは言え、1回しか処理しないのに、そのようなリストを作るのは面倒です。

そのような場合はGUIのファイル選択ダイアログやファイル保存ダイアログを使えば解決できます。 今回扱うのはPowerShellのファイル選択ダイアログとファイル保存ダイアログです。これらは数多くのプロパティを持っているため、詳細については以下のページを参照してください。

・OpenFileDialog クラス
https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.openfiledialog?view=windowsdesktop-6.0
・SaveFileDialog クラス
https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.savefiledialog?view=windowsdesktop-7.0

 macOSの場合はPowerShellといえどもWindowsと同じスクリプトを実行してファイルダイアログを表示することができません。ここらへんはOS依存という部分があるためです。そこでmacOSのPowerShellはAppleScriptを利用してファイル選択ダイアログ、ファイル保存ダイアログを表示することになります。ここらへんについては次回説明します。

WindowsのPowerShellでファイル選択ダイアログを表示

 まず、WindowsのPowerShellでファイル選択ダイアログを表示してみましょう。単純にファイル選択ダイアログを表示する場合は以下の一行でできます。直接PowerShellのコマンドラインで入力すればOKです。ただし、これは表示するだけです。

(New-Object System.Windows.Forms.OpenFileDialog).ShowDialog()

上記のコマンドを実行して何かファイルを選択すると画面にはOKの文字が表示されます。

ファイルが選択されずキャンセルされた場合はCancelの文字が表示されます。

ここで必要なのは選択されたファイルのファイルパスです。そこで今度は選択されたファイルパスを表示するスクリプトを作成します。メモ帳でもVSCodeでもよいのでとにかくエディタで以下のように入力しf2.ps1という名前で保存します。わかりやすくするために、ここではデスクトップ上に保存しています。

($dlg=New-Object System.Windows.Forms.OpenFileDialog).ShowDialog()
$dlg.FileName

保存したらカレントディレクトリをデスクトップにします。プロンプト部分で現在のディレクトリは確認できます。また、pwdと入力しても確認できます。

準備ができたらコマンドラインから.¥f2.ps1と入力します。ファイル選択ダイアログが表示されるのでファイルを1つ選択して開くボタンを押します。

ファイルが選択された場合はOKの文字の次の行に選択したファイルのパスが表示されます。

ファイルを選択せずにキャンセルした場合はCancelの文字が表示され、その次の行には何も表示されません。

今度はファイルが選択された場合のみファイルパスを表示するように変更します。以下のように入力しf3.ps1というファイル名で保存します。

if (($dlg=New-Object System.Windows.Forms.OpenFileDialog).ShowDialog() -eq "OK") {
    $dlg.FileName
}

保存したら実行してみましょう。ファイルを選択した場合のみパスが表示され、キャンセルされた場合は何も表示されません。

ここまでできてしまえば、あとはいろいろな用途で利用できます。例えば選択したファイルの内容を表示したい場合は以下のようにコマンドを入力します。

.¥f3.ps1 | %{ Get-Content $_ }

ダイアログで複数のファイルを選択する

 ここまでは1つのファイルしか選択できないダイアログでしたが、複数のファイルを選択したい場合もあります。複数のファイルを選択できるようにするにはダイアログオブジェクトのMultiselectプロパティをtrueにします。つまり$trueを代入すれば複数のファイルを選択できるようになります。(冒頭に示したOpenFileDialog クラスのページを参照)

 以下のようにスクリプトを入力しf4.ps1というファイル名で保存します。

$dlg=New-Object System.Windows.Forms.OpenFileDialog
$dlg.Multiselect=$true
if ($dlg.ShowDialog() -eq "OK") {
    $dlg.FileNames
}

保存したら実行してみましょう。今度は複数のファイルを選択できます。ダイアログの開くボタンをクリックすると選択したファイルのパスが表示されます。

選択した複数のファイルを連結して1つのテキストファイルにしてみましょう。不規則なファイル名であれば複数選択できるファイルダイアログは大変便利です。以下のように入力すると選択したファイルを連結してall.txtというファイルにまとめて保存します。

.¥f4.ps1 | %{ Get-Content $_ } > all.txt

ファイル保存ダイアログを表示する

 最後にファイル保存ダイアログを表示してみます。ファイル保存ダイアログはOpenFileDialogをSaveFileDialogの文字に変更するだけで使えます。
 以下のようにスクリプトを入力しf5.ps1というファイル名で保存します。

if (($dlg=New-Object System.Windows.Forms.SaveFileDialog).ShowDialog() -eq "OK") {
    $dlg.FileName
}

保存したら実行してみましょう。ファイル保存ダイアログが表示されるので保存するフォルダ先を選択しファイル名を入力します。ダイアログの保存ボタンをクリックすると入力したファイルのパスが表示されます。

 簡単な例としてSample Textの文字をファイル選択ダイアログで指定した場所とファイル名で保存してみましょう。以下のように入力します。ファイル保存ダイアログが表示されたら保存場所とファイル名を入力します。指定した場所にファイルが保存され、内容を確認するとSample Textになっているのがわかります。

.¥f5.ps1 | %{ 'Sample Text' > $_ }

コマンドラインでファイルダイアログを使いたい場合には今回のような方法で利用できます。上手に使ってミスを軽減できれば無駄な時間を費やさなくて済むでしょう。あと、ファイル選択ダイアログにはいろいろな機能(フィルタリング等)があるので、便利そうなプロパティがあれば積極的に使ってみるとよいかもしれません。

著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。