一旦加载到PowerShell中,ShouldProcess什么都不做

时间:2012-10-11 20:34:22

标签: c# powershell cmdlets

简单的情况,尝试编写一个cmdlet来提示用户确认他们的操作。这意味着我必须将ShouldProcess放在ProcessRecord方法调用中,但无论什么(没有提示)它总是返回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调用的返回值,那么无论我如何使用它,它总是正确的。在PowerShell 2和3中以及在vanilla机器上测试。使用Visual Studio 2010专业版。

1 个答案:

答案 0 :(得分:2)

尝试使用公共参数-WhatIf执行cmdlet。这应该导致ShouldProcess()返回false。我们的想法是在使用-WhatIf时显示cmdlet在没有实际执行的情况下会执行的操作。因此,您需要在ShouldProcess()调用中使用更具描述性的消息来指示您正在处理哪个管道对象(假设您支持管道绑定)。