如何在PowerShell二进制cmdlet中强制使用详细模式

pcww981p  于 2023-02-04  发布在  Shell
关注(0)|答案(1)|浏览(130)

在某些情况下,即使用户没有提供-verbose参数,我也希望将verbose开关强制为ON。例如,我的一些Cmlets从配置文件中读取其详细级别。
在常规Cmdlet(非二进制)中,我是这样实现的:

if ($MyInvocation.MyCommand.Module.PrivateData['verbose'])
    {
        $VerbosePreference = [System.Management.Automation.ActionPreference]::Continue
    }
    $isInVerboseMode = ($VerbosePreference -eq [System.Management.Automation.ActionPreference]::Continue)

注意,详细级别是从模块的PrivateData哈希表中读取的,并应用于$VerbosityPreference变量。
问:当我用C#开发一个二进制Cmdlet时,我该如何实现同样的行为?也许,一个更具体的问题是:如何访问C# Cmdlet中VerbosePreference变量?
谢谢

jgovgodb

jgovgodb1#

如果从PSCmdlet派生,则可以从二进制cmdlet设置PowerShell变量:

using System.Management.Automation;

public class MyCmdlet : PSCmdlet
{
    protected override void ProcessRecord()
    {
        this.SessionState.PSVariable.Set("VerbosePreference", ActionPreference.Continue);
    }
}

要在cmdlet中临时启用详细输出,我使用如下代码:

public class MyCmdlet : PSCmdlet
{
    protected override void ProcessRecord()
    {
        using var _ = this.EnableVerbose();
        //... cmdlet implementation
    }
}

static class UseVariableExtension
{
    public static IDisposable EnableVerbose(this PSCmdlet cmdlet) => new WithVariableValue(cmdlet, "VerbosePreference", ActionPreference.Continue);

    class WithVariableValue : IDisposable
    {
        readonly PSCmdlet _cmdlet;
        readonly string _variableName;
        readonly object _originalValue;

        public WithVariableValue(PSCmdlet cmdlet, string variableName, object? value)
        {
            _cmdlet = cmdlet;
            _variableName = variableName;
            _originalValue = cmdlet.GetVariableValue(variableName);
            cmdlet.SessionState.PSVariable.Set(variableName, value);
        }

        public void Dispose()
        {
            _cmdlet.SessionState.PSVariable.Set(_variableName, _originalValue);
        }
    }
}

相关问题