使用管道和写入输出时,顺序是否有任何差异

时间:2016-02-18 05:47:05

标签: powershell

我不是PowerShell的专家,但今天我遇到了这行代码(注意"Foo" | Write-Output 仅用作示例):

Write-Output "Foo"

我想知道它与我的期望是否有任何不同:

 php artisan queue:restart

1 个答案:

答案 0 :(得分:2)

效果中,两个语句应该是等效的

  • Write-Output "Foo"中,"Foo"隐式绑定到位置参数-InputObject,它接受​​类型PSObject[],即任何类型的对象数组。 / p>

  • "Foo" | Write-Output中,由于参数-InputObject被定义为可选地接受管道输入(按值,即整个对象),"Foo"也绑定到{{1} }}

我假设您选择了-InputObject作为示例,但是没有什么值得明确使用该cmdlet的理由很简单 - 只需在示例中省略它就会产生相同的结果。

此外, 几个cmdlet,其中两个表单等效,即Write-Output被定义为标量(有例外);请考虑以下事项:

-InputObject
  • 1, 2 | Get-Member # reports [System.Int32] Get-Member -InputObject 1, 2 # reports [System.Object[]] 报告输入数组中每个元素的类型成员。

  • 相比之下,
  • 1, 2 | Get-Member会报告数组类型本身的成员。

这种行为差异是有意的并且有记录:使用参数Get-Member -InputObject 1, 2)允许检查集合类型作为一个整体 ,而使用管道允许检查集合的各个元素的类型。

请注意,即使将集合作为一个整体传递给它们,但是行为中也存在相同的cmdlet,例如-InputObject;在这种情况下,请始终使用管道

确定cmdlet的哪些参数接受管道输入,从而了解将绑定哪个参数管道输入:

  • 要在完整帮助主题的上下文中查看参数

    • 运行Export-Csv;使用Get-Help -Full <cmdlet>至关重要。
    • 搜索-Full的匹配项,它将匹配接受的参数:
      • 仅按值(整个对象)输入管道:true (
      • 仅按属性名称输入的管道:true (ByValue)
      • true (ByPropertyName)
      • 更一般地说,每个参数说明都有一个true (ByValue, ByPropertyName)订单项,后跟一个布尔值。
  • 提取仅列出名称及其别名,数据类型和绑定特征(以Accept pipeline input?为例):

    Rename-Item