1

简单的案例,尝试编写一个 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 以及原版机器上进行了测试。使用 Visual Studio 2010 专业版。

4

1 回答 1

2

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

于 2012-10-11T22:06:35.257 回答