【问题标题】:Why does PowerShell Pipeline.Output.ReadToEnd return an empty collection?为什么 PowerShell Pipeline.Output.ReadToEnd 返回一个空集合?
【发布时间】:2015-05-18 16:23:43
【问题描述】:

使用 C# 和 System.Management.Automation 来运行 PowerShell 命令 - 我试图了解 Pipeline.Output 属性的用途/意图。这段代码:

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 应该用于什么?我误会了什么?

【问题讨论】:

    标签: c# powershell


    【解决方案1】:

    当您调用 Invoke() 时,它会立即返回输出 - Output 仅在您异步调用管道时才会填充。

    示例,调用并等待最多一秒:

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

    或者更好的是,为StateChanged event 设置一个事件处理程序

    【讨论】:

    • 谢谢!所以如果你是同步运行的,那就没用了。
    • @Skrymsli 是的,因为它会立即被读取并返回 - 插入一个中断,你会在 Invoke() 返回时看到 pipeline.Output.EndOfPipeline == true
    猜你喜欢
    • 1970-01-01
    • 2017-12-01
    • 2012-02-20
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多