我有以下用于使用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等待脚本无论如何都要完成。
任何指示赞赏!
答案 0 :(得分:2)
我看了PowerShell
班source code on GitHub。
如果您搜索源代码,您会发现只有在“批处理模式”下运行时才会尊重ErrorActionPreference
属性。
从查看代码并修改PowerShell.Commands
属性,在我看来,这只是意味着已向实例添加了多个语句。这有点意义 - 如果只有一个声明要执行那么就没有必要试图弄清楚是否继续。
因此,您应该能够在执行之前简单地添加一个空语句来触发ErrorActionPreference
属性的检查:
powerShellInstance.AddStatement();
IAsyncResult async = powerShellInstance.BeginInvoke<PSObject, PSObject>(null, output, powershellSettings, null, null);