【问题标题】:Generating output objects?生成输出对象?
【发布时间】:2014-04-21 13:23:10
【问题描述】:

我目前正在编写一些命令作为 PowerShell cmdlets 并且到目前为止执行我需要的操作没有问题(处理来自管道的对象)。但是我现在需要做一些不同的事情,从零开始并生成对象(也就是说,我没有记录作为输入,只是一个简单的文本param,我需要为管道的下一阶段生成数据)。

如何将新数据“传递”到管道?有人可以为我提供一个类似 out-generate -size X 这样的命令的示例,它会以我可以做到的方式在管道中生成 X 个连续整数

out-generate -size 10 | out-gridview

到目前为止,我不知道如何将数据作为输出发送,我知道如何写入数据 (WriteObject),但我假设(可能是错误的)它只写入文本表示而不将对象发送到管道。还是我只需要将东西传递给WriteObject

【问题讨论】:

    标签: c# powershell powershell-2.0 powershell-3.0 cmdlets


    【解决方案1】:

    您应该使用Write-Output cmdlet。但是,它是默认的 cmdlet,如果语句的返回值(仅使用变量名或 cmdlet 的返回值)是“语句的结尾”,它将被执行。

    因此,您可以通过显式调用 Write-Output 来执行以下操作(我发现这使代码更易于阅读):

    function Get-Integers
    {
        PARAM (
            $NumberOfIntegers
        )
    
        for($i = 0; $i -lt $NumberOfIntegers; $i ++)
        {
            Write-Output $i
        }
    }
    
    Get-Integers 10 | Out-GridView
    

    或者您可以忽略Write-Output 调用。

    function Get-Integers
    {
        PARAM (
            $NumberOfIntegers
        )
    
        for($i = 0; $i -lt $NumberOfIntegers; $i ++)
        {
            $i
        }
    }
    
    Get-Integers 10 | Out-GridView
    

    Write-Output 上的文档(如果您调用 Get-Help Write-Output -Full 可以得到)说明,除其他外:

    将指定的对象发送到管道中的下一个命令。如果命令是管道中的最后一个命令,则对象将显示在控制台中。

    【讨论】:

    • 这不是我的问题,您正在展示如何从函数写入管道,我正在尝试从 cmdlet 执行此操作(如在 C# 中编写基于 dll 的实际命令)
    • 抱歉,在您的问题中没有看到。但是,您应该只使用equivalent cmdlet command Cmdlet.WriteObject。行为仍然存在,它将对象发送到管道,如果它是管道中的最后一个,它将打印到控制台。
    • @robert.westerlund 迂腐地说,如果它是管道中的最后一个,它将通过管道进入 Out-Default cmdlet。格式化输出并将输出写入主机的是 Out-Default cmdlet。
    • 非常正确。我迷上了上面包含的Get-Help Write_Output -Full 的qoute。但是您对Out-Default 的看法是正确的。感谢您的澄清!
    【解决方案2】:

    最后,似乎调用 WriteObject 实际上确实做到了,除非我首先想到的是(它不会将对象作为文本写入控制台,而是根据我的需要将其作为对象写入管道)。

    【讨论】:

      猜你喜欢
      • 2017-05-27
      • 2013-02-20
      • 1970-01-01
      • 2021-07-30
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多