Создание конвейера PowerShell для чтения асинхронных в C # - PullRequest
0 голосов
/ 02 июля 2018

Я хотел бы создать эквивалент в 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()
}

Но это не синхронизация . Я хотел бы создать конвейер и читать из него асинхронно. Является ли это возможным?

Спасибо!

ПРИМЕЧАНИЕ. Это связано, но не асинхронно: Как передавать команды powershell в c #

1 Ответ

0 голосов
/ 02 июля 2018

У меня возникли проблемы с распознаванием команды Get-Disk|Get-Partition, поэтому я остановился на dir|select Name. Надеюсь, в вашей среде вы можете заменить Get-Disk|Get-Partition обратно.

Используется объект PowerShell из System.Management.Automation

.
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 много раз в прошлом и нашел его очень полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...