コマンドラインツールを利用していると、フォルダやファイルのパスを入力したいケースはよくある。タブ補完機能などを利用すればパス入力の負担をある程度軽減できるとはいえ、必ずしも最良の解決策とはいえない。.NET Frameworkが提供するフォルダ/ファイル選択ボックスを利用すれば、ファイルのGUIで簡単にユーザーに入力させることが可能になる。
対象:Windows PowerShell
コマンドラインツールの実行中に、読み込み対象のファイル、あるいは保存先のフォルダを指定するためにパスを入力したいという局面は、少なからず発生する。PowerShellでは、このようなパス入力を簡易に行うためにいくつかの方法を提供している。
その1つがタブ補完機能である。タブ補完機能を利用することで、例えば、「C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727」のようなパスを指定したい場合には以下のようにすればよい。
PS > C:\W →ここまで入力してから、[Tab]キーを数回押下
PS > C:\WINDOWS →末尾に「\M」と入力してから[Tab]キーを数回押下
PS > C:\WINDOWS\Microsoft.NET →末尾に「\F」と入力してから[Tab]キーを数回押下
PS > C:\WINDOWS\Microsoft.NET\Framework →末尾に「\v」と入力してから[Tab]キーを数回押下
PS > C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
このようにタブ補完機能を利用すれば、該当するフォルダ配下のサブフォルダ/ファイルを自動的に補ってくれるので、長いパスも必要最小限のタイプ量で入力できるというわけだ。
また、エクスプローラからフォルダ/ファイルをドラッグ&ドロップするという方法もある。以下の図のように、エクスプローラからパスとして入力したいフォルダ/ファイルをマウスで選択し、PowerShellのシェル上にドラッグ&ドロップするだけだ。
もっとも、これらの方法は使い勝手という意味で、必ずしも最良の選択肢とはいえない。タブ補完機能はパスの階層が深くなるとタイプ量も多くなるし、フォルダ/ファイル名をうろ覚えだと(ファイルを一望できない分)選択が難しいという問題がある。また、ドラッグ&ドロップにしても、パス入力のためにエクスプローラをいちいち開き、目的のフォルダまでたどり着かなければならないという意味では、必ずしも手軽とはいいきれない(もちろん、いずれの方法も長いパスをタイプミスすることなく、正確に記述できるというメリットはある)。
そこで本Tech TIPSでは、PowerShellスクリプトからWindows標準のフォルダ/ファイル選択ボックスを表示し、そこで選択されたフォルダ/ファイルをスクリプト側で受け取る方法について紹介する。これによって、コマンドライン上のパス入力をシンプルに行うことが可能になる。
PowerShellを利用するには、あらかじめシステムにユーザー自身がインストールしておく必要があります。具体的なインストール方法については別稿の「PowerShellをインストールする」を参照してください。
まずはテキストエディタ(メモ帳でも何でもよい)を開き、以下のコードを入力してほしい。
なお、「#」から始まる行は、コードの意味を解説するためのコメント部分なので、省略してもよい。コメントにはスクリプトの簡単な説明を入れておいた。
# 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.Filter = "画像ファイル(*.PNG;*.JPG;*.GIF)|*.PNG;*.JPG;*.JPEG;*.GIF"
$dialog.InitialDirectory = "C:\"
$dialog.Title = "ファイルを選択してください"
# ダイアログを表示
if($dialog.ShowDialog() -eq "OK"){
# [OK]ボタンがクリックされたら、選択されたファイル名(パス)を表示
$dialog.FileName + " が選択されました。"
}
PowerShellスクリプトの実行ファイルは拡張子を「.ps1」とする必要がある。ファイル名は何でも構わない。ここでは「dialog.ps1」という名前で保存しておこう。
コード全体の流れについてはリスト内のコメントをご覧いただくとして、以下ではいくつか重要なポイントにフォーカスしてみよう。
フォルダ/ファイル選択ボックスを表示するには、.NET FrameworkのOpenFileDialogクラス(System.Windows.Forms名前空間)を利用する。ただし、System.Windows.Forms名前空間を含むSystem.Windows.Formsアセンブリは、PowerShellはデフォルトで有効化していない(読み込まれない)ので、要注意だ。
このようなアセンブリを利用するには、Assemblyクラス(System.Reflection名前空間)のLoadメソッドを使って、あらかじめ「アセンブリの読み込み」という作業を行っておく必要がある。アセンブリの読み込み方法については、Tech TIPS「PowerShellでVisual Basicの組み込み関数を利用する」を参照していただきたい。
前述したように、フォルダ/ファイル選択ボックスを生成するのは、OpenFileDialogクラスの役割だ。OpenFileDialogクラスでは、フォルダ/ファイル選択ボックスの表示/動作を設定するためのプロパティを公開している。以下では、その中でも重要なものをいくつかまとめておくことにしよう。
プロパティ | 概要 |
---|---|
AddExtension | 拡張子が無指定の場合、自動的に拡張子を補完するか |
CheckFileExists | 存在しないファイルが指定された場合に警告を表示するか |
CheckPathExists | 存在しないパスが指定された場合に警告を表示するか |
FileName | 選択されたファイル名 |
FileNames | 選択されたファイル名(複数選択時) |
Filter | [ファイルの種類]欄に表示されるフィルタ文字列 |
InitialDirectory | デフォルトで表示するフォルダ |
Multiselect | 複数ファイルの選択を許可するか |
Title | ダイアログのタイトル |
OpenFileDialogクラス(System.Windows.Forms名前空間)の主なプロパティ |
本サンプルでは、最低限、Filter/InitialDirectory/Titleといったプロパティを設定している。Filterプロパティには、以下のような形式でフィルタ情報を指定できる。
<表示テキスト> | <フィルタパターン>
<フィルタパターン>には「*.拡張子」のような形式で表示を許可するパターンをセミコロン(;)区切りで指定すればよい。ここでは、拡張子が「.png」「.jpeg」「.jpg」「.gif」であるファイルのみを表示するように設定している*1。
*1 もしも複数のフィルタを適用したい場合には、「"テキストファイル (*.txt)|*.txt|すべてのファイル (*.*)|*.*" 」のように、パイプ区切りで指定すればよい。
必要なプロパティの設定ができたら、あとは実際にフォルダ/ファイル選択ボックスを表示するだけだ。選択ボックスを表示するのは、ShowDialogメソッドの役割である。
ShowDialogメソッドは戻り値として、(ダイアログ上でクリックされたボタンに応じて)「OK」「Cancel」という文字列を返すので*2、ここでは戻り値が「OK」である場合にのみ、選択されたファイル名(FileNameプロパティ)を取得している。
ここではファイル名をただ表示しているだけである。もちろん、通常のスクリプトでは取得したファイル名に応じて、(例えば)ファイルの読み込みなどの処理を記述することになるはずだ。
*2 厳密には、DialogResult列挙体のメンバを返す。ただし、PowerShellでは内部的に型キャストが行われるので、これを意識することなく、単なる文字列として操作できる。
dialog.ps1を実行するには、PowerShellのプロンプトを開いたうえで、以下のようにコマンドを実行すればよい(カレントフォルダにスクリプトが保存されているものとする*3)。
PS > ./dialog.ps1
C:\Documents and Settings\Yamada\デスクトップ\tmp\ebbe.jpg が選択されました。
スクリプトを実行すると、フォルダ/ファイル選択ボックスが表示されることを、また、選択ボックスから適当なファイルを選択し、[OK]ボタンをクリックすることで、選択されたファイルのパスが表示されることを確認してほしい。上のような結果が得られれば、スクリプトは正しく動作している*3。
*3 PowerShellでスクリプトファイルを実行する場合には、あらかじめいくつかの設定を行っておく必要がある。詳細については、別稿「Windows PowerShellコマンド&スクリプティング入門(後編)」も参照いただきたい。
dialog.ps1の例では、フォルダ/ファイル選択ボックスを表示する例を見てみたが、ほとんど同じ要領でファイル保存ボックスを表示することも可能だ。保存ボックスを表示するには、dialog.ps1の以下の部分を書き換えるだけでよい。
$dialog = New-Object System.Windows.Forms.OpenFileDialog
$dialog = New-Object System.Windows.Forms.SaveFileDialog
書き換えた後、手順2の要領でスクリプトを実行してみよう。フォルダ/ファイル選択ボックスの代わりに、ファイル保存ボックスが表示されれば成功だ。
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.