PowerShellでMessageBox(MsgBox)を使う方法や、選択に応じて分岐する方法
本エントリーの目次
PowerShellスクリプトの処理中に、メッセージボックス(MessageBox)を表示したい!
PowerShellスクリプトの処理中に、ユーザーに何らかのメッセージを表示したり、ユーザーの選択(判断)に応じて、その後の処理を分岐したい!
というケースは少なくありません。
たとえば、PowerShellの処理が正常に完了した場合に、処理の最後に『〇〇○処理が正常に完了しました。』といったメッセージを表示するだとか。
PowerShellの処理中に『〇〇○を完全に削除しますか?』というメッセージを表示し、『はい』が選択された場合は完全削除を実行。
『いいえ』が選ばれた場合には、削除処理を中止する、なんてケースが考えられますね。
こういった処理は、C#などのプログラミング言語であれば『System.Windows.Forms.MessageBox』クラス。
VBAであればMsgBox関数などを使うことで実装可能です。
しかし本エントリー執筆時点の最新バージョンのPowerShellでは、MessageBoxクラスと同様の機能を提供するコマンドレットは用意されていません。
そこで今回は、PowerShellの処理中にメッセージボックスを表示する方法と、表示したメッセージボックスに対するユーザーの選択に応じて処理を分岐する方法をご紹介します!
PowerShellスクリプトの処理中に、メッセージボックスを表示する方法
C#言語で記述されているプログラムは、.NET Frameworkで実行されます。(.NET Frameworkの機能を使用しているということです。)
そして実はPowerShellでは、.NET Frameworkのオブジェクトを呼び出して使用することが可能です。
つまりPowerShellでは、C#のMessageBoxクラスと同じものを呼び出して使用できる、ということです。
たとえば『こんにちは!』というメッセージを表示するメッセージボックスを表示したいときは、以下のような処理を記述します。
1 2 | Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.MessageBox]::Show("こんにちは!") |
上記PowerShellスクリプトを実行すると、以下のようなメッセージボックスが表示されます。
1行目の『Add-Type -AssemblyName System.Windows.Forms;』という部分では、.NET Frameworkの『System.Windows.Forms』アッセンブリーをロードしています。
これは、PowerShellから『System.Windows.Forms』名前空間の配下にあるクラスを使用する際に、必要となる処理です。
2行目は、C#の『MessageBox.Show』メソッドと同様であるため、詳細はMicrosoftさんの以下資料を確認ください。
Microsoft Docs – MessageBox.Show メソッド
PowerShellでメッセージボックスを使いやすくする方法
先にご紹介した『[System.Windows.Forms.MessageBox]::Show』を使用する方法では、Windows PowerShell ISEを使ってパラメーターを記述する際、インテリセンス(入力支援機能)が動作しません。
そのため、コードを記述する際に少し不便でしょう。
そこで、インテリセンスが動作する以下のような関数を作成し、それを使う方法がおすすめです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Add-Type -AssemblyName System.Windows.Forms; <# メッセージボックスを表示するメソッド パラメーターは、.NET FrameworkのMessageBox.Showメソッドを参照 https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.messagebox.show #> function Show-Msgbox([string]$Text, ` [string]$Caption = "PowerShell", ` [System.Windows.Forms.MessageBoxButtons]$MessageBoxButtons = [System.Windows.Forms.MessageBoxButtons]::OK, ` [System.Windows.Forms.MessageBoxIcon]$MessageBoxIcon = [System.Windows.Forms.MessageBoxIcon]::Information, ` [System.Windows.Forms.MessageBoxDefaultButton]$MessageBoxDefaultButton = [System.Windows.Forms.MessageBoxDefaultButton]::Button1){ [System.Windows.Forms.MessageBox]::Show($Text, $Caption, $MessageBoxButtons, $MessageBoxIcon,$MessageBoxDefaultButton) } Show-Msgbox -text "こんにちは!" |
上記PowerShellスクリプトを実行すると、以下のようなメッセージボックスが表示されます。
以後の説明では、この『Show-Msgbox』メソッドを使った方法をご紹介しましょう!
PowerShellで『Show-Msgbox』メソッドを使って、各種メッセージボックスを表示する方法
PowerShellで改行を含んだメッセージボックスを表示したいときには、以下のような処理を記述してください。
1 | Show-Msgbox -text "こんにちは!`r`n`改行しました。" |
このコマンドレットを実行すると、以下のようなメッセージボックスが表示されます。
また、アイコン画像が不要である場合には、『-MessageBoxIcon』パラメーターに『None』を指定してください。
1 | Show-Msgbox -text "こんにちは!" -MessageBoxIcon None |
メッセージボックスのキャプション部を変更したい場合には、『-Caption』パラメーターに設定したい文字列を指定します。
1 | Show-Msgbox -text "こんにちは!" -Caption "キャプション" |
アイコン画像を疑問符(クエスチョン)マークとし、『はい』と『いいえ』ボタンを表示。
さらに、第2ボタンの『いいえ』をデフォルトボタン(初期表示状態で選択されているボタン)としたいときは、以下のようなコマンドを実行してください。
1 2 | Show-Msgbox -text "設定変更の適用には、コンピューターの再起動が必要です。`r`n`r`n今すぐにコンピューターを再起動しますか?" ` -MessageBoxButtons YesNo -MessageBoxIcon Question -MessageBoxDefaultButton Button2 |
上記例のようなPCの再起動確認や、ファイルの削除確認など、誤操作された場合の影響が大きい処理の事前確認については、デフォルトボタンを実行しない選択肢としておくと良いでしょう。
メッセージボックスに対するユーザーの選択に応じて処理を分岐する方法
『Show-Msgbox』関数で表示したメッセージボックスに対するユーザーの選択は、変数で受け取ることが可能です。
メッセージボックスの選択内容を『$DialogResult』変数で受け取る場合には、以下のように記述を行います。
1 2 3 4 5 6 7 8 | #『OK』と『キャンセル』ボタンを表示する場合 $DialogResult = Show-Msgbox -Text "テスト" -MessageBoxButtons OKCancel -MessageBoxIcon Question #『中止』と『再試行』、『無視』ボタンを表示する場合 $DialogResult = Show-Msgbox -Text "テスト" -MessageBoxButtons AbortRetryIgnore -MessageBoxIcon Question #『はい』と『いいえ』ボタンを表示する場合 $DialogResult = Show-Msgbox -Text "テスト" -MessageBoxButtons YesNo -MessageBoxIcon Question |
『OK』と『キャンセル』ボタンを表示したメッセージボックス:
『中止』と『再試行』、『無視』ボタンを表示したメッセージボックス:
『はい』と『いいえ』ボタンを表示したメッセージボックス:
『$DialogResult』変数には、選択内容が『System.Windows.Forms.DialogResult』列挙型で格納されます。
参考:Microsoft Docs – DialogResult 列挙型
したがって以下のような記述により、メッセージボックスに対するユーザーの選択に応じて処理を分岐可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | Switch ($DialogResult){ {$_ -eq [System.Windows.Forms.DialogResult]::None}{ Write-Host "DialogResultはNoneです。" break } {$_ -eq [System.Windows.Forms.DialogResult]::OK}{ Write-Host "OKがクリックされました。" break } {$_ -eq [System.Windows.Forms.DialogResult]::Cancel}{ Write-Host "キャンセル(Cancel)がクリックされました。" break } {$_ -eq [System.Windows.Forms.DialogResult]::Abort}{ Write-Host "中止(Abort)がクリックされました。" break } {$_ -eq [System.Windows.Forms.DialogResult]::Retry}{ Write-Host "再試行(Retry)がクリックされました。" break } {$_ -eq [System.Windows.Forms.DialogResult]::Ignore}{ Write-Host "無視(Ignore)がクリックされました。" break } {$_ -eq [System.Windows.Forms.DialogResult]::Yes}{ Write-Host "はい(Yes)がクリックされました。" break } {$_ -eq [System.Windows.Forms.DialogResult]::No}{ Write-Host "いいえ(No)がクリックされました。" break } } |
たとえば、先ほど紹介したPCの再起動確認のメッセージボックスであれば、以下のような記述を行うと良いでしょう。
1 2 3 4 | if ([System.Windows.Forms.DialogResult]::Yes -eq (Show-Msgbox -text "設定変更の適用には、コンピューターの再起動が必要です。`r`n`r`n今すぐにコンピューターを再起動しますか?" ` -MessageBoxButtons YesNo -MessageBoxIcon Question -MessageBoxDefaultButton Button2)){ Restart-Computer } |
参考:Windows パソコンをキーボード操作でシャットダウンや再起動する方法
以上、参考になさってくださーい!