Где вывод "Write-Host" идет в Powershell System.Management.Automation Справочные сборки 4.0

Я использую System.Management.Automation со ссылочными сборками 4.0 с C#. Мне нужно увидеть вывод Write-Host. Документация говорит, что Write-Host будет выведен в выходной поток. Что такое поток вывода для получения вывода Write-Host в C# при использовании эталонных сборок powershell 4.0.

Я знаю, что информационный конвейер позже добавлялся в Powershell версии 5.0, а Write-Host и Write-Information всегда направляли вывод в информационный конвейер.

Но мне нужно увидеть выходные данные Write-Host, пока есть справочные сборки для powershell 4.0. С помощью следующего кода я нигде не могу увидеть вывод Write-Host. Ни на выходе, ни в выходных коллекциях.

В настоящее время я подписался на следующие потоки.

using (var powerShell = PowerShell.Create(iss))
{           
            var psScript = "Write-Host test input";
            powerShell.AddScript(psScript);

            powerShell.Streams.Debug.DataAdding += OnDebugDataAdding; 
            powerShell.Streams.Error.DataAdding += OnErrorAdding;
            powerShell.Streams.Warning.DataAdding += OnWarningAdding;
            powerShell.Streams.Verbose.DataAdding += OnVerboseAdding;

            var outputCollection = new PSDataCollection<PSObject>();
            outputCollection.DataAdding += OnOutputDataAdding; // all spitted outputs getting into outputCollection

            powerShell.Invoke(null, outputCollection);
}

2 ответа

Я нашел ответ на тот же вопрос в разделе Как я могу выполнять сценарии в оболочке PowerShell, созданной с помощью кода, в которой есть команды Write-Host?

Перед вызовом AddScript добавьте эти два оператора:

powerShell.AddScript("function Write-Host($out) {Write-Output $out}").Invoke();
powerShell.Commands.Clear();

Если вы хотите продолжать использовать класс Pipeline, вы можете использоватьCommand.MergeMyResults метод . Например, чтобы перенаправить потоки всех типов на вывод конвейера:

      private string RunScript(string scriptText) {

    Runspace runspace = RunspaceFactory.CreateRunspace();

    runspace.Open();

    Pipeline pipeline = runspace.CreatePipeline();
    pipeline.Commands.AddScript("Write-Host Test");
    pipeline.Commands[pipeline.Commands.Count-1]
       .MergeMyResults(PipelineResultTypes.All, PipelineResultTypes.Output)
    
    Collection < PSObject > results = pipeline.Invoke();

    runspace.Close();

    foreach(PSObject obj in results) {
        Console.WriteLine(obj.ToString());
    }
}
Другие вопросы по тегам