2015-05-18 2 views
0

Использование C# с System.Management.Automation для запуска команды PowerShell - я пытаюсь понять цель/намерение свойства Pipeline.Output. Этот код:Почему PowerShell Pipeline.Output.ReadToEnd возвращает пустую коллекцию?

class Program 
{ 
    static void Main(string[] args) 
    { 
     var results = new List<PSObject>(); 
     var stdout = new List<PSObject>(); 

     using (var runspace = RunspaceFactory.CreateRunspace()) 
     { 
      runspace.Open(); 
      using (var pipeline = runspace.CreatePipeline()) 
      { 
       pipeline.Commands.Add(new Command("Get-ChildItem")); 

       results.AddRange(pipeline.Invoke()); 
       stdout.AddRange(pipeline.Output.ReadToEnd()); 
      } 
      runspace.Close(); 
     } 

     Console.WriteLine("results.Count: {0}", results.Count); 
     Console.WriteLine("stdout.Count: {0}", stdout.Count); 
    } 
} 

Печать:

results.Count: 7 
stdout.Count: 0 

Я ожидаю, как рассчитывает быть 7. Документация редка на Pipeline.Output. Может ли кто-нибудь пролить свет на то, что Pipeline.Output предполагается использовать? Что я недопонимаю?

ответ

2

Когда вы вызываете Invoke(), он немедленно возвращает результат - Output только заселяется при асинхронном вызове конвейера.

Пример, вызов и ждет максимум второй:

pipeline.InvokeAsync(); 
pipeline.Output.WaitHandle.WaitOne(1000); 
if(pipeline.PipelineStateInfo.State == PipelineState.Completed) { 
    stdout.AddRange(pipeline.Output.ReadToEnd()); 
} 

Или еще лучше, создать обработчик событий для StateChanged event

+0

Спасибо! Поэтому, если вы работаете синхронно, это бесполезно. – Skrymsli

+0

@Skrymsli да, потому что он считывается и возвращается сразу - вставьте разрыв, и вы увидите, что 'pipe.Output.EndOfPipeline == true', как только' Invoke() 'возвращает –

Смежные вопросы