【问题标题】:ShouldProcess doing nothing once loaded into PowerShell加载到 PowerShell 后,ShouldProcess 什么也不做
【发布时间】:2012-10-12 08:02:41
【问题描述】:

简单的案例,尝试编写一个 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 Pro。

【问题讨论】:

    标签: c# powershell powershell-cmdlet


    【解决方案1】:

    尝试使用通用参数-WhatIf 执行 cmdlet。这应该会导致 ShouldProcess() 返回 false。这个想法是显示当使用 -WhatIf 时 cmdlet 会做什么而不实际执行它。因此,您可能希望在 ShouldProcess() 调用中提供更具描述性的消息,以指示您正在处理的管道对象(假设您支持管道绑定)。

    【讨论】:

    • 太棒了,谢谢。我还没有意识到它是如何从文档中工作的,但我想现在它是有道理的。谢谢!
    猜你喜欢
    • 2017-08-26
    • 2018-12-13
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多