c# - 使用复杂命令渲染 Powershell 输出
问题描述
我正在尝试通过 C# 应用程序执行 PS1 文件并根据严重性捕获/分割输出。错误、调试、信息等。这是一个 Windows 窗体应用程序。这是运行方法,我在单击按钮时调用它:
PowerShell m_PSInst = PowerShell.Create();
//Add the script to execute
m_PSInst.AddScript(fileName);
//Attach to the Info Stream
m_PSInst.Streams.Information.DataAdded += (sender, args) =>
{
var psData = (PSDataCollection<InformationRecord>)sender;
var results = psData.ReadAll();
foreach (var result in results)
{
AddInfo(result.ToString());
}
};
//Run Async
Task.Factory.FromAsync(m_PSInst.BeginInvoke(), pResult => m_PSInst.EndInvoke(pResult));
在我的 AddInfo 方法中,我正在检查对 UI 层的线程访问
public void AddInfo(string value)
{
if (InvokeRequired)
{
Invoke(new Action<string>(AddInfo), value);
return;
}
infoTextbox.AppendText(value, Color.White);
allOutputTextbox.AppendText(value, Color.White);
Application.DoEvents();
}
我的PS1文件内容如下:
Write-Information "Test-Before"
Get-WebBinding
Write-Information "Test-After"
我看到的是“Test-Before”,就是这样。在 Get-WebBinding 命令之后,所有输出流似乎都没有收到任何内容。我尝试添加 Out-Default、Out-String 甚至指向 Out-File。似乎没有任何效果。
此处未显示的是其他流的其他 DataAdded 方法,包括错误、调试、详细、进度和警告。很想停止在这个上踢自己。:)
解决方案
我认为这是一个 32/64 位的东西。某些 Cmdlet 仅在 64 位模式下运行,包括Get-WebBinding
Cmdlet。
尝试确保您的 pshost 编译为 64 位。
推荐阅读
- python - 如何从字典中随机选择一个项目?
- android - 在 Android 服务中使用 ADAL 获取访问令牌
- c# - Postsharp:从一个方面访问已经应用的方面
- r - 将 sql 数据表转换为 sparklyr 数据框
- apache - 重写除了 ! 在 htaccess Apache 2.4.6 中不起作用
- android - Unity Android清单合并问题
- python - 在 python 中,如何创建一个名称未指定的新变量,直到运行时(编辑:如何将 setattr() 与列表组合一起使用)?
- python - 如何在另一个 Python 类构造函数中实例化 Python 类?
- hazelcast - Hazelcast 3.8.2 中的内存泄漏
- git - 有什么方法可以在同一个文件夹中拥有版本化和非版本化的 .gitignore?