【Powershell】ファイルダイアログやフォルダダイアログを利用する方法まとめ

スポンサーリンク
powershell
スポンサーリンク

ダイアログを使えればUXは向上する!・・・かも。

うちの社内SNSにも、たまーにpowershellスクリプトを上げている人がいるけど、みんなコードに直接変数を入力する方式で上げている。
基本的にコードをイジるのはある程度知識が必要だったり、初心者には心理的ハードルがあるもの。
というわけで私はよくダイアログを活用するので、よく使うものをまとめる。

まずアセンブリ読み込みを宣言する

PowerShellは.Net Frameworkライブラリを使用する。いくつか標準でロードされている場合もあるけど、今回必要になるのは以下2つ。

# アセンブリ読み込み
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

ちなみに、今ロード済みのアセンブリを調べる場合は
[System.AppDomain]::CurrentDomain.GetAssemblies() | % { $_.GetName().Name }
とpowershellで打つと出てくる。↓な感じ。

PS C:\Users\username> [System.AppDomain]::CurrentDomain.GetAssemblies() | % { $_.GetName().Name }
mscorlib
powershell_ise
Microsoft.PowerShell.ISECommon

~中略~

System.Configuration.Install
Microsoft.PowerShell.Commands.Utility.resources

ファイルを指定する。~ファイルダイアログの使い方~

ファイルダイアログの使い方。
シーンとしては、特定のCSVファイルを読み込みたいときとかによく使う。

こんな感じのものを作って、ユーザーが迷うことなくファイルダイアログを開く操作をできるようにする。

フォームを構成する要素は、基本的に以下5つがおすすめ。(作るものによるけど)
・フォーム(名)
・ラベル
・テキストボックス
・ 参照ボタン ※実際にファイルダイアログ開くボタン
・ OKボタン
・Cancelボタン

# フォーム作成
$Form = New-Object System.Windows.Forms.Form 
$Form.Size = New-Object System.Drawing.Size(400,130) 
 ### Drawing.Sizeはオブジェクト(ここではフォーム)の大きさを指定するもの
$Form.Text = "[ここにフォームの名前を書く]"

# ラベル作成
$LabelFilePath = New-Object System.Windows.Forms.Label
$LabelFilePath.Location = New-Object System.Drawing.Point(20,10)
 ### Drawing.Pointはオブジェクト(ここではラベル)の表示位置を指定するもの
$LabelFilePath.Size = New-Object System.Drawing.Size(300,20)
$LabelFilePath.Text = "[ここにラベル(説明など)を書く]"
$Form.Controls.Add($LabelFilePath)

# 入力用テキストボックス ※参照したり指定したファイルがわかるようにこの欄を設けておく
$TextBoxFilePath = New-Object System.Windows.Forms.TextBox
$TextBoxFilePath.Location = New-Object System.Drawing.Point(20,30)
$TextBoxFilePath.Size = New-Object System.Drawing.Size(300,20)
$Form.Controls.Add($TextBoxFilePath)

# 参照ボタン。後述するが、ここでファイルダイアログを開くようにしてやる
$ButtonFilePath = New-Object System.Windows.Forms.Button
$ButtonFilePath.Location = New-Object System.Drawing.Point(320,30)
$ButtonFilePath.Size = New-Object System.Drawing.Size(40,20)
$ButtonFilePath.Text = "参照"
$Form.Controls.Add($ButtonFilePath)

# OKボタン
$ButtonOK = New-Object System.Windows.Forms.Button
$ButtonOK.Location =  New-Object System.Drawing.Point(230,60)
$ButtonOK.Size = New-Object System.Drawing.Size(60,20)
$ButtonOK.Text = "OK"
$Form.Controls.Add($ButtonOK)

# Cancelボタン
$ButtonCancel = New-Object System.Windows.Forms.Button
$ButtonCancel.Location =  New-Object System.Drawing.Point(300,60)
$ButtonCancel.Size = New-Object System.Drawing.Size(60,20)
$ButtonCancel.Text = "キャンセル"
$ButtonCancel.DialogResult = "Cancel"
$Form.Controls.Add($ButtonCancel)

# 参照ボタンをクリック時の動作。ここでファイルダイアログを開くようにしてやる
$ButtonFilePath.add_click{

    #ダイアログを表示しファイルを選択する
    $Dialog = New-Object System.Windows.Forms.OpenFileDialog
    ###このForms.OpenFileDialogがファイルダイアログを開く処理となっている。
    if($Dialog.ShowDialog() -eq "OK"){
        $TextBoxFilePath.Text = $Dialog.FileName
     ###ファイルダイアログでファイルを選択しOKが押下されたら、テキストボックスにファイルネームを表示させる
    }
}

# OKボタンをクリック時の動作
$ButtonOK.add_click{

    #ファイルパスが入力されていないときは背景を黄色にする
    if($TextBoxFilePath.text -eq ""){
        $TextBoxFilePath.BackColor = "yellow"
    }else{
        $Form.DialogResult = "OK"
    }
}

これでファイルファイルダイアログの作成はOK。
ここから、ダイアログに入力された内容を使いたい場合は以下のような感じでOKボタン押下後の処理を作成すればOK。

$FormResult = $Form.ShowDialog()
if($FormResult -eq "OK"){

###ここにフォームでOKボタンを押下されたときの処理を記載する

} else {
}

フォルダを指定する。~フォルダダイアログの使い方~

続いて、フォルダを指定するダイアログの使い方。
利用シーンとしては、何らか操作を行いたいフォルダを指定する場合や、出力結果を保存する場所指定をしたい場合などに利用できると思う。
ファイルダイアログと読み込むアセンブリは同じ。フォーム作成も同じなので、違いは $Dialog = New-Object System.Windows.Forms.OpenFileDialogとしていた部分の変更となる。
具体的には以下。

# 参照ボタンをクリック時の動作
$ButtonFilePath.add_click{

  #ダイアログを表示しファイルを選択する
  $Dialog = New-Object System.Windows.Forms.FolderBrowserDialog
    ###このForms.FolderBrowserDialogがフォルダダイアログを開く処理となっている。
   if($Dialog.ShowDialog() -eq "OK"){
    $TextBoxFilePath.Text = $Dialog.SelectedPath
     ###フォルダダイアログでフォルダを選択しOKが押下されたら、テキストボックスにフォルダ(パスネーム)を表示させる
  }
}

注意点と補足

・PowerShellが実行可能な環境である必要があります。

改版履歴

2021/02/05 初版公開

コメント

タイトルとURLをコピーしました