我有以下 C# 代码,用于使用 BeginInvoke 调用 powershell。我有以下要求:
- 用于“实时”输出流、详细流和错误流的事件处理程序
- 我需要能够在执行脚本时注入(inject) 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 无论如何都会等待脚本完成。
感谢任何指点!
最佳答案
我查看了 PowerShell
类 source code on GitHub 。
如果您搜索源代码,您会发现 ErrorActionPreference
属性仅在“批处理模式”下运行时才被使用。
通过查看代码并修改 PowerShell.Commands
属性,在我看来,这仅仅意味着多个语句已添加到实例中。这是有道理的 - 如果只有一个语句要执行,那么尝试确定是否继续是没有意义的。
因此,您应该能够通过在执行前添加一个空语句来触发对 ErrorActionPreference
属性的检查:
powerShellInstance.AddStatement();
IAsyncResult async = powerShellInstance.BeginInvoke<PSObject, PSObject>(null, output, powershellSettings, null, null);
关于c# - PowerShell BeginInvoke - PSInitationSettings 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43642423/