我想在 C# 中创建与此等效的内容:
PS > Get-Disk | Get-Partition
我试过这个:
using (var r = RunspaceFactory.CreateRunspace())
{
var pipeline = r.CreatePipeline();
var gd = new Command("Get-Disk");
var gv = new Command("Get-Partition");
pipeline.Commands.Add(gp);
pipeline.Commands.Add(gv);
var results = pipeline.Invoke()
}
但是这不是同步。我想创建管道并异步读取它。是否可以?
谢谢!
注意:这是相关的,但不是异步的:How pipe powershell commands in c#
最佳答案
我在让它识别 Get-Disk|Get-Partition
命令时遇到了一些问题,所以我选择了 dir|select Name
。希望在您的环境中,您可以将 Get-Disk|Get-Partition
替换回来。
这是使用 System.Management.Automation
中的 PowerShell
对象
using (PowerShell powershell = PowerShell.Create()) {
powershell.AddScript("dir | select Name");
IAsyncResult async = powershell.BeginInvoke();
StringBuilder stringBuilder = new StringBuilder();
foreach (PSObject result in powershell.EndInvoke(async)) {
stringBuilder.AppendLine(result.ToString());
}
Console.WriteLine(stringBuilder);
}
例如,我只是调用 .BeginInvoke()
并使用 .EndInvoke(async)
来演示其异步部分。您需要根据自己的需要对其进行调整(即以不同方式处理结果等),但我过去曾多次使用过此 PowerShell
类,发现它非常有用。
关于c# - 创建一个 PowerShell 管道以在 C# 中读取异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51139976/