PowerShellのShouldProcessを理解したい

VSCodeでPowerShellのモジュールとか書いてると、 PSScriptAnalyzer によるチェックが常時行われてるので普段は気にも留めないようなことも度々注意されるのよね

今回は SupportsShouldProcess のお話

Verbが Set とか New とか Remove とか、ともすればシステムに影響を与えかねない関数名だった場合に以下を警告されるよ

そういうときは ShouldProcess をサポートすべきだ、と
え…なにそれ初耳なんですけお…

調べてみました
どうやらこれ、 Copy-Item とかでお馴染みな -WhatIf とか -Confirm をちょろっと実装できる仕組みの様だよ

じゃあやってみましょう

function Test-ShouldProcess
{
    [CmdletBinding(SupportsShouldProcess)]
    param()
}

CmdletBinding()SupportsShouldProcess をTRUEにしとくと、 -WhatIf-Confirm が使えるようになります
これが下準備ね

続いて、実際 -WhatIf-Confirm した場合の処理も書いていくよ

function Test-ShouldProcess
{
    [CmdletBinding(SupportsShouldProcess)]
    param()
    process
    {
        if ($PSCmdlet.ShouldProcess('ターゲット', 'ゴニョゴニョする'))
        {
            return '実行されました!'
        }
        return '実行されませんでした'
    }
}

$PSCmdlet.ShouldProcess() というメソッドを使います
こいつは

  • -WhatIf しなかった場合
  • -Confirm で実行を許可した場合

にTRUEを返すようになってます
そんで引数は -WhatIf したときのメッセージに書かれる内容ですね
一個目が操作対象、二個目が何をするかでともに [string] です

PS> Test-ShouldProcess
実行されました!

PS> Test-ShouldProcess -WhatIf
WhatIf: 対象 "ターゲット" に対して操作 "ゴニョゴニョする" を実行しています。
実行されませんでした

PS> Test-ShouldProcess -Confirm # はい を選ぶ

確認
この操作を実行しますか?
対象 "ターゲット" に対して操作 "ゴニョゴニョする" を実行しています。
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y
実行されました!

PS> Test-ShouldProcess -Confirm # いいえ を選ぶ

確認
この操作を実行しますか?
対象 "ターゲット" に対して操作 "ゴニョゴニョする" を実行しています。
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): n
実行されませんでした

だいたいこんな感じ!
意外と簡単でしたね!

追記:2016/08/26

-WhatIf しないときに -Verbose パラメータをつけると

詳細: 対象 "○○" に対して操作 "△△" を実行しています。

がVerboseとして表示されます

おまけ

ShouldProcess だとわざわざConfirmスイッチを入れないと確認してくれません
毎回強制的に実行確認したい!そういうときもあるよね
いいだろう、なら $PSCmdlet.ShouldContinue

function Test-ShouldContinue
{
    [CmdletBinding(SupportsShouldProcess)]
    param()
    process
    {
        if ($PSCmdlet.ShouldContinue('ここに とどまりますか?', 'とてつもなく恐ろしい悪魔の気配がする……'))
        {
            if ($PSCmdlet.ShouldContinue('本当に とどまりますか?', ' '))
            {
                return '魔人 ゴーストQが 1体出た!'
            }
        }
        return '魔人は 現れなかった……'
    }
}
PS> Test-ShouldContinue

とてつもなく恐ろしい悪魔の気配がする……
ここに とどまりますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):


本当に とどまりますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):
魔人 ゴーストQが 1体出た!

あと、 $PSCmdlet.ShouldProcess() にしても $PSCmdlet.ShouldContinue() にしても幾つかオーバーロードがあったのでなんかもっと便利な使い方があるのかもしれませんが、とりあえずこんなとこで

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中