1

ユーザーにアクションの確認を求めるコマンドレットをコーディングしようとする単純なケース。これは、ProcessRecord メソッド呼び出しにShouldProcessを配置する必要があることを意味しますが、何があっても (プロンプトを表示せずに) 常に true を返します。簡単なケースを次に示します。

using System;
using System.Management.Automation;

[Cmdlet(VerbsDiagnostic.Test, "ShouldProcess",
    SupportsShouldProcess = true)]
public class TestShouldProcessCommand : Cmdlet
{
    [Parameter(Position = 0,
        ParameterSetName = "Force")]
    public SwitchParameter Force;

    protected override void ProcessRecord()
    {
        if (ShouldProcess("ShouldProcess Target"))
        {
            if (Force || ShouldContinue("ShouldContinue Query", 
                "ShouldContinue Caption"))
            {
                WriteObject("Hello");
            }
            else
            {
                ThrowTerminatingError(new ErrorRecord(new Exception(
                    "Error Message"), "Error ID", 
                    ErrorCategory.InvalidData, "Target Object"));
            }
        }
    }
}

PowerShell をロードして実行しようとすると (Import-Module を使用して dll をインポートした後)、次のようになります。

PS C:\Users\user> Test-ShouldProcess

ShouldContinue Caption
ShouldContinue Query
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Y
Hello

これは ShouldContinue の予想される出力ですが、最初に来る ShouldProcess 呼び出しでは何も起こりません。ShouldProcess 呼び出しの戻り値を出力するだけであれば、どのように使用しても常に true です。PowerShell 2 および 3、およびバニラ マシンでテスト済み。Visual Studio 2010 Pro を使用しています。

4

1 に答える 1

2

共通パラメーターを指定してコマンドレットを実行してみてください-WhatIfShouldProcess()これにより、false が返されるはずです。アイデアは、コマンドレットが使用されたときに実際に実行せずに、コマンドレットが何をするかを示すこと-WhatIfです。そのため、どのパイプライン オブジェクトで作業しているかを示すために、呼び出しでより説明的なメッセージが必要になりますShouldProcess()(パイプライン バインディングをサポートしていると仮定します)。

于 2012-10-11T22:06:35.257 に答える