ShouldProcess ничего не делает после загрузки в PowerShell

Простой случай: попытка написать командлет, который предложит пользователю подтвердить свое действие. Это означает, что я должен поставить 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 и пытаетесь запустить его (после импорта dll с помощью Import-Module), все, что вы получаете, это:

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.


person squid808    schedule 11.10.2012    source источник


Ответы (1)


Попробуйте выполнить командлет с общим параметром -WhatIf. Это должно привести к тому, что ShouldProcess() вернет false. Идея состоит в том, чтобы показать, что будет делать командлет, не делая этого на самом деле, когда используется -WhatIf. Таким образом, вы хотели бы, чтобы более описательное сообщение в вызове ShouldProcess() указывало, над каким объектом конвейера вы работаете (при условии, что вы поддерживаете привязку конвейера).

person Keith Hill    schedule 11.10.2012
comment
Фантастика, спасибо. Я не понял, как это должно было работать из документации, но я полагаю, что теперь это имеет смысл. Благодарю вас! - person squid808; 12.10.2012