从C#访问常见的Powershell cmdlet参数

时间:2019-03-03 15:53:58

标签: c# powershell

更具体地,我想通过cmdlet访问ErrorAction参数的值。

在powershell中,所有功能均按预期运行

function Get-Test {
    [CmdletBinding()]
    param (

    )
    (Get-Variable|where{$_.Name -eq "ErrorActionPreference"}).Value

}
Get-Test -ErrorAction SilentlyContinue

将输出SilentContinue

但是在c#中相同的调用将输出Continue

    [CmdletBinding]
    [Cmdlet(VerbsCommon.Get,"Test")]
    public class MyClass:PSCmdlet{
        protected override void ProcessRecord(){
            base.ProcessRecord();
            WriteObject(((PSVariable) InvokeCommand.InvokeScript($"Get-Variable|where{{$_.Name -eq 'ErrorActionPreference'}}").First().BaseObject).Value);
        }
    }

ErrorAction时,ErrorActionPreference参数和c#之间似乎没有链接。我之所以这样说,是因为

$ErrorActionPreference="SilentlyContinue"
Get-Test # c# version

将输出SilentlyContinue

1 个答案:

答案 0 :(得分:0)

通常,在内部(按定义 编译) cmdlet ,无需确定 是否传递了通用参数,或者先前设置的首选项变量是否隐含了其值

  • Cmdlet可以依赖于其基类提供的基础结构,以自动对任何显式传递或由首选项变量隐含的公共参数值适当地起作用。

    • 例如,WriteVerbose()调用会根据是否在cmdlet调用中显式指定了-Verbose以及在缺少$VerbosePreference首选项变量的值的情况下隐式调整其输出行为。呼叫者的范围。

高级功能 中-已在PowerShell中实现的已编译cmdlet对应项-明确指定的通用参数将自动转换为功能范围的首选项变量

  • 这是一个实现细节,但遗憾的是,它是highly problematic

  • 但是,当 正常工作时-在与调用方源于同一个作用域的高级函数中-效果与已编译的cmdlet中相同:调用cmdlet例如Write-Verbose确实隐式地选择了显式指定的通用参数以及调用者的首选项变量值(在后一种情况下,通过同一范围域中的范围隐式地看到了(最近)祖先范围中的变量)。