適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話など気になったことも載せているブログです。

【Write-Verbose】スクリプトや関数の詳細を表示する【PowerShell】

PowerShellのスクリプトや関数で処理の経過やデバッグ情報を表示するのに皆さんはどうしていますか?

Write-Hostでコンソールに書き出している人もいるかも知れません。

それも一つの手段ではありますが、場合によってはデバッグ情報を表示したくないときでも問答無用でコンソール上に表示されてしまいます。

PowerShellにはそんな問題をスマートに解決してくれる便利なコマンドレット、Write-Verboseコマンドレットがあります。

Write-VerboseコマンドレットはVerboseの単語が示す通り、詳細を表示するためのコマンドレットです。

この記事ではデバックや経過表示に最適なWrite-Verboseコマンドレットについて紹介したいと思います。

Write-Verboseコマンドレット

百聞は一見に如かず、ということで、まずはWrite-Verboseコマンドレットの挙動を確認してみましょう。

Write-Verboseコマンドレットの挙動は、自動変数の$VerbosePreference変数という値によって制御されています。

$VerbosePreference変数が取りうる値については後述します。

まずはデフォルト値である$VerbosePreference="SilentlyContinue"の挙動を見ていきましょう。

ちなみに$VerbosePreference変数の現在の値は次のように入力することで確認できます。

 
$VerbosePreference
#出力結果
SilentlyContinue

この状態でWrite-Verboseコマンドレットを実行してみても、何も表示されません。

 
Write-Verbose -Message "これは詳細メッセージです。"

次に-Verboseオプションを設定して実行してみると

 
Write-Verbose -Message "これは詳細メッセージです。" -Verbose
#出力結果
詳細: これは詳細メッセージです。

先ほどは表示されなかった詳細メッセージが表示されました。

-Verboseオプションを付与することで詳細メッセージが表示されるようになります。

実はWrite-Verboseを単体で使用することはほとんどありません。

基本的には、スクリプトや関数の中に書いておき、そのスクリプトや関数が-Verboseスイッチ付で呼ばれたときに詳細を表示するような使い方がほとんどです。

関数で使用する

関数の中で使用する場合の例はこんな感じになります。

 
function Test{
   [Cmdletbinding()]
   param()
   begin{Write-Verbose "[$(get-date)] 処理開始"}
   process{Write-Verbose "[$(get-date)] 処理中"}
   end{Write-Verbose "[$(get-date)] 処理終了"}
}

-Verboseオプションを付与して、この関数を実行することで詳細メッセージが表示されました。

f:id:shinmai_papa:20210825103233p:plain

これを利用することで、-Verboseオプションを使って処理の経過を表示したり、デバッグ情報を表示することができるようになります。

もちろん関数だけでなくスクリプトでも使用可能です。

ちなみに [Cmdletbinding()]属性を付与することで関数をコマンドレットと同じように扱うことができるようになり、PowerShellのデフォルトのオプションが使えるようになります。

$VerbosePreference

$VerbosePreferenceの値を変えることで詳細情報の表示をデフォルトにすることもできます。

 
$VerbosePreference=2

もしくは

 
$VerbosePreference="Continue"

とすることで詳細情報が表示されるようになります。

$VerbosePreferenceが取ることのできる値については、PowerShellのバージョンによって微妙に異なってくるのでActionPreference Enumのドキュメントを参照されると一番間違いないかと思います。

ですが、ドキュメントに目を通すのが面倒なときは次のようにして調べることもできます。

 
[System.Management.Automation.ActionPreference]::GetNames($VerbosePreference.GetType())
#出力結果
SilentlyContinue
Stop
Continue
Inquire
Ignore
Suspend

終わりに

Write-Verboseコマンドレットの使い方について紹介しました。

関数やスクリプトをよりユーザーフレンドリーにするためにもぜひ使いこなしたいコマンドレットですね。

私は使いこなせてませんが。

ここまでお読みいただき、ありがとうございました。