Где вывод "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());
}
}