c# - PowerShell BeginInvoke - PSInitationSettings 不起作用

标签 c# powershell

我有以下 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 无论如何都会等待脚本完成。

感谢任何指点!

最佳答案

我查看了 PowerShellsource 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/

相关文章:

c# - 从 MVC 中的部分 View 加载菜单

sql-server - 在Powershell中查询SqlServer

syntax - 我可以让 "&&"或 "-and"在 PowerShell 中工作吗?

python - 比较 PowerShell 和 Python 生成的 Windows PowerShell 中的两个 JSON 对象

powershell - 无法将“PowerShell”识别为内部或外部命令

powershell - Powershell变量替换无法从命令行运行

c# - 提高图像的打印质量

c# - 如何从 FQL 枚举响应集

c# - 在后台工作线程中使用 C# 全局变量是否安全

c# - 如何在 C# 中将 html 转换为 BBcode