简单的情况,尝试编写一个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专业版。
答案 0 :(得分:2)
尝试使用公共参数-WhatIf
执行cmdlet。这应该导致ShouldProcess()
返回false。我们的想法是在使用-WhatIf
时显示cmdlet在没有实际执行的情况下会执行的操作。因此,您需要在ShouldProcess()
调用中使用更具描述性的消息来指示您正在处理哪个管道对象(假设您支持管道绑定)。