PowerShell BeginInvoke - PSInvocationSettings无效

时间:2017-04-26 18:57:37

标签: c# powershell

我有以下用于使用BeginInvoke调用powershell的c#代码。我有以下要求: - 用于输出,详细和错误流的“实时”流式传输的事件处理程序 - 我需要能够在执行脚本时注入ErrorActionPreference

我的代码如下所示(powershellScriptSettings.StopOnErrors总是bool true):

powershellSettings.ErrorActionPreference = powershellScriptSettings.StopOnErrors ? ActionPreference.Stop : ActionPreference.Continue;

IAsyncResult async = powerShellInstance.BeginInvoke<PSObject, PSObject>(null, output, powershellSettings, null, null);

//wait for it to complete
try
{
    powerShellInstance.EndInvoke(async);
}

查看输出流,我可以看到此代码执行写入错误命令,并且$ ErrorActionPreference的值处于默认值(Continue):

$ErrorActionPreference
Write-error 'err1'
Write-Error 'err2'

所以很明显我的powershellSettings没有效果。我知道我可以将字符串$ErrorActionPreference=Stop添加到输入脚本的开头,但我有点想用“C#”方式,并使用Powershell api中的可用功能。

我想知道我的代码是否有错,因为我没有实现BeginInvoke的回调函数 - 我无法看到我需要它,因为EndInvoke等待脚本无论如何都要完成。

任何指示赞赏!

1 个答案:

答案 0 :(得分:2)

我看了PowerShellsource code on GitHub

如果您搜索源代码,您会发现只有在“批处理模式”下运行时才会尊重ErrorActionPreference属性。

从查看代码并修改PowerShell.Commands属性,在我看来,这只是意味着已向实例添加了多个语句。这有点意义 - 如果只有一个声明要执行那么就没有必要试图弄清楚是否继续。

因此,您应该能够在执行之前简单地添加一个空语句来触发ErrorActionPreference属性的检查:

powerShellInstance.AddStatement();
IAsyncResult async = powerShellInstance.BeginInvoke<PSObject, PSObject>(null, output, powershellSettings, null, null);