PowerShellでフォルダ/ファイル選択ボックスを利用するTech TIPS

コマンドラインツールを利用していると、フォルダやファイルのパスを入力したいケースはよくある。タブ補完機能などを利用すればパス入力の負担をある程度軽減できるとはいえ、必ずしも最良の解決策とはいえない。.NET Frameworkが提供するフォルダ/ファイル選択ボックスを利用すれば、ファイルのGUIで簡単にユーザーに入力させることが可能になる。

» 2008年02月15日 05時00分 公開
[山田祥寛]
「Tech TIPS」のインデックス

連載目次

PowerShellでフォルダ/ファイル選択ボックスを利用する

対象:Windows PowerShell


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のシェル上にドラッグ&ドロップするだけだ。

エクスプローラでファイルやフォルダを選択して、PowerShellのウィンドウ上にドラッグ
ドロップすると、そのフルパス名が自動的に入力される ドラッグ&ドロップで該当するフォルダ/ファイルのパスを入力する
エクスプローラでファイルやフォルダを選択して、PowerShellのウィンドウ上にドラッグするとマウスカーソルの形状が変わる。そしてドロップすると、そのフルパス名が自動的に入力される。

 もっとも、これらの方法は使い勝手という意味で、必ずしも最良の選択肢とはいえない。タブ補完機能はパスの階層が深くなるとタイプ量も多くなるし、フォルダ/ファイル名をうろ覚えだと(ファイルを一望できない分)選択が難しいという問題がある。また、ドラッグ&ドロップにしても、パス入力のためにエクスプローラをいちいち開き、目的のフォルダまでたどり着かなければならないという意味では、必ずしも手軽とはいいきれない(もちろん、いずれの方法も長いパスをタイプミスすることなく、正確に記述できるというメリットはある)。

 そこで本Tech TIPSでは、PowerShellスクリプトからWindows標準のフォルダ/ファイル選択ボックスを表示し、そこで選択されたフォルダ/ファイルをスクリプト側で受け取る方法について紹介する。これによって、コマンドライン上のパス入力をシンプルに行うことが可能になる。

[注意]

PowerShellを利用するには、あらかじめシステムにユーザー自身がインストールしておく必要があります。具体的なインストール方法については別稿の「PowerShellをインストールする」を参照してください。


手順1――テキストエディタで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 + " が選択されました。"
}

ファイル:dialog.ps1
サンプルファイルdialog.ps1をダウンロードするには、ここをクリックしてください。

 PowerShellスクリプトの実行ファイルは拡張子を「.ps1」とする必要がある。ファイル名は何でも構わない。ここでは「dialog.ps1」という名前で保存しておこう。

 コード全体の流れについてはリスト内のコメントをご覧いただくとして、以下ではいくつか重要なポイントにフォーカスしてみよう。

1.必要なアセンブリの有効化

 フォルダ/ファイル選択ボックスを表示するには、.NET FrameworkのOpenFileDialogクラス(System.Windows.Forms名前空間)を利用する。ただし、System.Windows.Forms名前空間を含むSystem.Windows.Formsアセンブリは、PowerShellはデフォルトで有効化していない(読み込まれない)ので、要注意だ。

 このようなアセンブリを利用するには、Assemblyクラス(System.Reflection名前空間)のLoadメソッドを使って、あらかじめ「アセンブリの読み込み」という作業を行っておく必要がある。アセンブリの読み込み方法については、Tech 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」であるファイルのみを表示するように設定している*1

*1 もしも複数のフィルタを適用したい場合には、「"テキストファイル (*.txt)|*.txt|すべてのファイル (*.*)|*.*" 」のように、パイプ区切りで指定すればよい。


3.フォルダ/ファイル選択ボックスを表示するのはShowDialogメソッド

  必要なプロパティの設定ができたら、あとは実際にフォルダ/ファイル選択ボックスを表示するだけだ。選択ボックスを表示するのは、ShowDialogメソッドの役割である。

 ShowDialogメソッドは戻り値として、(ダイアログ上でクリックされたボタンに応じて)「OK」「Cancel」という文字列を返すので*2、ここでは戻り値が「OK」である場合にのみ、選択されたファイル名(FileNameプロパティ)を取得している。

 ここではファイル名をただ表示しているだけである。もちろん、通常のスクリプトでは取得したファイル名に応じて、(例えば)ファイルの読み込みなどの処理を記述することになるはずだ。

*2 厳密には、DialogResult列挙体のメンバを返す。ただし、PowerShellでは内部的に型キャストが行われるので、これを意識することなく、単なる文字列として操作できる。


手順2――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の要領でスクリプトを実行してみよう。フォルダ/ファイル選択ボックスの代わりに、ファイル保存ボックスが表示されれば成功だ。

「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。