今回はmacOSのPowerShellでファイルダイアログを表示します。macOSでもファイルダイアログが使えれば便利です。なお、macOSの場合は特にPowerShellでなくてもbash,zshでもファイルダイアログを利用することができます。
AppleScript経由でダイアログを表示する
macOSの場合は過去の経緯によりAppleScriptを利用するのが一番妥当かつ安全ではないかと思われます。AppleScriptは一般的なプログラミング言語(C言語などアルゴル系言語)とは異なり独特の文法を持っています。wikiで調べてみると、もう30年も前に発表されたとあります。AppleScriptはHyperCard上で動作していたHyperTalk言語と似ていますが、そこらへんで挫折してしまったので、あまり深入りはしたくないという気もします。が、今回は避けて通れないので試行錯誤しながらなんとかファイルダイアログを表示しています。
・AppleScript
https://ja.wikipedia.org/wiki/AppleScript
まずはファイル選択ダイアログを表示してみます。PowerShellのコマンドラインから以下のように入力します。
'choose file' | osascript
するとファイル選択ダイアログが表示されます。
ファイルを選択し終わるとコマンドラインには選択したファイルのパスが表示されます。パスは絶対パスになります。キャンセルされた場合は、その旨メッセージが表示されます。
選択したファイルのパスは以下のように表示されます。ここらへん使用しているファイルシステムによって異なるのかもしれません。以下の例はHFS+での場合です。
alias Macintosh HD:Users:weed:Desktop:sample:f1.txt
ここで困ってしまうのがmacOSの場合、ディレクトリ(フォルダ)の区切り記号が:(コロン)になっているということです。UNIX系ではディレクトリ(フォルダ)の区切り記号は/(スラッシュ)です。このままではせっかくファイル選択ダイアログを利用できてもPowerShell,bash,zsh等で使えません。上記のダイアログで得られたパスをそのまま指定してもエラーになってしまうためです。
そこで得られたパスを/区切りのパスに変換する必要があります。要はPOSIX形式に変換すれば解決することになります。そして、都合の良いことにPOSIX形式に変換する命令が用意されています。POSIX path of〜という書式で〜の部分に変換したいパスを指定します。
以下のように入力すると:で区切られたパスが/区切りに変換されます。
'POSIX path of "Macintosh HD:Users:weed:Desktop:sample:f1.txt"' | osascript
あとはファイル選択ダイアログと組み合わせればできあがりです。以下のようにコマンドを入力すれば選択したファイルのパスをPOSIX形式で取得できます。
'POSIX path of file {choose file}' | osascript
ファイルのパスを取得してしまえばあとはどうにでもなります。ファイル選択ダイアログで選択したファイルの内容を表示する場合は以下のようにコマンドを入力します。以下の例ではファイル選択ダイアログで選択されたファイルの内容を表示しています。(この原稿のイントロ部分をサンプルテキストファイルとして用意したものです)
'POSIX path of file {choose file}' | osascript | %{ Get-Content $_ }
複数のファイルを選択できるダイアログを表示する
次に複数のファイルを選択できるダイアログを表示してみます。複数のファイルを選択する需要は多くあります。複数ファイルを選択できるようにするにはchoose fileの後にオプションを指定します。と言っても一般的なコマンドラインのオプションとは異なりwith multiple selections allowedのような文字列を指定します。AppleScriptでは複数のファイル選択指定だけでなく画像形式のみ、テキスト形式のみ選択させるような事もできます。
以下のように入力すると複数のファイルを選択できるダイアログが表示されます。選択されたファイルは,区切り(AppleScriptリスト形式)で出力されます。
'choose file with multiple selections allowed' | osascript
動作を確認したら次は選択した複数のファイルをPOSIX形式に変換して出力してみましょう。とりあえず以下のように入力して動作を確認してみます。
'POSIX path of file {choose file with multiple selections allowed}' | osascript
結果はエラーで動作しないようです。まとめて一括変換して出力してくれると楽なのですが、なかなかそうもいかないようです。仕方ないのでテキストエディタでスクリプトを作成します。以下のスクリプトをテキストエディタで入力しf4.txtというファイル名で保存しておきます。(もし以下のスクリプトで何も出力されない場合は最終行の次にfListの一行を追加してください)
set f to choose file with multiple selections allowed
set fList to ""
repeat with i in f
set fList to fList & (POSIX path of file i) & ASCII character (10)
end repeat
保存したらf4.txtがあるディレクトリに移動します。移動したら以下のように入力します。ファイル選択ダイアログが表示されます。複数のファイルを選択すると選択したファイルのパスが表示されます。
Get-Content ./f4.txt | osascript
ファイル保存ダイアログを表示する
次にファイル保存ダイアログを表示してみましょう。これは簡単でコマンドラインで以下のように入力するだけです。
'POSIX path of file {choose file name}' | osascript