2015-06-09

PowerShellでフォルダ選択ダイアログを使用する

[第1回] PowerShellでMessageBoxを使用する
[第2回] PowerShellでInputBoxを使用する

第3回は「フォルダ選択ダイアログ」を取り上げたいと思います。

取り上げたのはいいものの、私は普段、この「フォルダ選択ダイアログ」をほとんど使いません。
よって、あまり深く調査しておりませんので、今回は基本型のみとなります。
(今後、使用頻度が高まり、更に調査した場合は追記いたします)


ではさっそく「フォルダ選択ダイアログ」の基本型を記述します。

---------ここから-------------------------------------------------------------------------------------
# フォルダ選択ダイアログ 基本型

# COMオブジェクトの読み込み
$shell = New-Object -com Shell.Application
   
# フォルダ選択ダイアログの表示   
$folderPath = $shell.BrowseForFolder("A","B","C","D")

---------ここまで-------------------------------------------------------------------------------------

 では解説していきます。


◆1行目
$shell = New-Object -com Shell.Application

これをうまく説明できるほど収めてはいないのですが、フォルダ選択ダイアログを使用するにはCOMオブジェクトを読み込む必要があります。
まずこの一文を記述しないと、2行目以降が機能しませんので、必ず記述してください。
なお、文頭の$shellは変数ですので、自由に変更して構いません。

◆2行目
$folderPath = $shell.BrowseForFolder("A","B","C","D")

ここでダイアログを表示します。

この文のうち、A~Dは引数です。次の通り、指定方法があります。

A…[第一引数] "0"としておけばとりあえずOK
B…[第二引数] ダイアログ中に表示する文字列を指定します。 
C…[第三引数] "0"としておけばとりあえずOK
D…[第四引数] 最初に選択するフォルダを指定します。
          何も指定しない場合、デスクトップが初期フォルダとして設定されます。


以上を踏まえて、例を記述します。

---------ここから-------------------------------------------------------------------------------------
# フォルダ選択ダイアログ

# COMオブジェクトの読み込み
$shell = New-Object -com Shell.Application

# ダイアログを表示し、結果を変数folderPathに格納する
$folderPath = $shell.BrowseForFolder(0,"対象フォルダーを選択してください",0,"C:\")

# キャンセルを選択した場合は終了
if ( $folderPath -eq $null){exit}

#  $folderPath内の情報のうち、パス情報のみを変数PATHに格納する
$PATH = $folderPath.Self.Path

# 格納したパスをメッセージボックスで表示
Add-Type -Assembly System.Windows.Forms
[System.Windows.Forms.MessageBox]::Show($PATH,"処理完了")

---------ここまで-------------------------------------------------------------------------------------

 上の内容をコピーして、PowerShell ISEを起動し、貼り付けたあと、[スクリプトを実行(F5)]を押してみてください。

まず始めに下の画像のようなダイアログが表示されます。
(フォルダ構成はお使いのPCによって異なります)



例として、この中から「DC-7000」フォルダを選択し、「OK」を押します。




このように表示されれば成功です!
(選択したフォルダによって、表示メッセージは変化します)

 メッセージボックスについては[第1回] PowerShellでMessageBoxを使用するを参照してください。

いかがでしたでしょうか?
このフォルダ選択ダイアログは、他にも記述方法があるようですが、様々な情報が錯綜し、私の知識ではどれが正しいのか判断がつかず、使えるようになるまで少々てこずった記憶があります。

もし、他にも同じように悩んでいる人がいて、その方の参考になれば幸いです。

 =======================================================================
本投稿は筆者が独自に調査したものを投稿しておりますので、間違い等もあるかと思います。
本投稿に関する疑問や質問には可能な限りお答えいたします。
また、反対にアドバイス等がございましたら、ぜひご連絡をお願い致します。
=======================================================================
Google+、Twitterで更新情報をお届けしています!
ぜひフォローをお願い致します!           
=======================================================================
スポンサーリンク


3 件のコメント:

  1. こんばんは。

    このフォルダ選択ダイアログで、次のようなことは実現可能でしょうか。

    1.別のフォームから呼び出した場合に、最前面に表示する。

    2.特定のドライブを除外、または指定のドライブのみ対象にする。

    アドバイス頂けると幸いです。

    返信削除
  2. コメントありがとうございます。
    また、返信が遅くなり、申し訳ありません。

    お問い合わせの件、私も調べてみましたが、残念ながらこのフォルダ選択ダイアログでの実現は難しいようです。

    フォルダ選択ダイアログは上記のものとは別にもうひとつ.NETを使用したものがあるのですが、そちらであれば1は実現可能のようです。

    記述方法は以下になります。

    # アセンブリのロード
    Add-Type -AssemblyName System.Windows.Forms

    # フォームのインスタンス化
    $f = New-Object Windows.Forms.Form

    # 常に最前面に表示するよう設定
    $f.TopMost = $True

    # フォルダ選択ダイアログのインスタンス化
    $dialog = New-Object System.Windows.Forms.FolderBrowserDialog

    # ダイアログ内のテキストを設定
    $dialog.Description = "フォルダを選択してください"

    # ダイアログを表示(フォームを親にする)
    $dialog.ShowDialog($f)

    これであれば、常に最前面で表示されるはずです。
    その他のプロパティ等は下記を参照ください。

    https://msdn.microsoft.com/ja-jp/library/system.windows.forms.folderbrowserdialog%28v=vs.110%29.aspx

    しかし、2のドライブ除外/指定については何の資料も見つかりませんでした。
    今後、実現可能な方法を見つけましたらまた返信させていただきます。

    お力になれず、申し訳ありません。m(__)m

    返信削除
    返信
    1. コメント頂きまして、ありがとうございます。

      まず、2のドライブ指定ですが、当方の環境である事象に見舞われました。
      それは、空の光学ドライブを選択し、その後に別のフォルダを選択してOKすると、
      またはキャンセルすると、スクリプト本体がエラーで強制終了します。
      空の光学ドライブを選択することで、何かしらのイベント?が発生していると
      思うのですが・・・何もわかっていません。
      結局、これを避けるために、思い立った次第です。


      また、ご呈示頂きましたドットネットのコードですが、Win7環境では
      期待した動作を得られませんでした。※Win10環境では問題なし。

      MSのサイトでは、v1.1以上とあるので、Win7環境でも動作する筈です。


      以上、取り急ぎ経過のご報告までに。

      削除

疑問・質問・リクエスト お気軽にどうぞ (^O^)/