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