Powershell中管道参数的默认值列表

时间:2010-05-21 18:36:29

标签: powershell parameters default

我有一个Powershell脚本,可以读取管道中的值:

PARAM (
    [Parameter(ValueFromPipeline = $true)] 
    $s
)

PROCESS {
    echo "* $s"
}

工作得很好:

  

PS> my.ps1 foo
  * foo

我希望脚本具有默认值列表,因为最常见的用法将始终使用相同的值,并将它们存储在默认值中将是最方便的。我做了通常的任务:

PARAM (
    [Parameter(ValueFromPipeline = $true)] 
    $s = 'bar'
)

PROCESS {
    echo "* $s"
}

再次,工作得很好:

  

PS> my.ps1
  *酒吧   PS> my.ps1 foo
  * foo

然而,当将默认值设置为列表时,我会得到一些完全合理但完全不符合要求的内容:

PARAM (
    [Parameter(ValueFromPipeline = $true)] 
    $s = @('bar', 'bat', 'boy')
)

PROCESS {
    echo "* $s"
}

结果:

  

PS> my.ps1
  *棒球棒男孩

我期待:

  

PS> my.ps1
  *酒吧   *蝙蝠
  *男孩

如何为每个默认值调用Process循环? (这与在Process中调用一个,并将当前主体包装在一个大的foreach循环中超过$ s有所不同)。

2 个答案:

答案 0 :(得分:6)

正如您所希望的那样,通过对代码进行此更改,可以更明确地显示它:

PARAM ( 
    [Parameter(ValueFromPipeline = $true)]  
    $s = @('bar', 'bat', 'boy') 
) 

PROCESS { 
    $s | %{$_ + " is a " + $_.GetType().Name}
}

您感到困惑的是PowerShell的一个功能,当要求将数组渲染为字符串时,它会展平数组,例如:

PS> $arr = 1,2,3
PS> "$arr"
1, 2, 3
PS> $OFS = ', '
PS> "$arr"
1, 2, 3

默认情况下,PowerShell使用空格分隔符一个接一个地显示每个数组项。您可以通过设置输出字段分隔符变量$OFS来将默认分隔符更改为任何字符串。

答案 1 :(得分:-1)

而不是:

PROCESS { 
    echo "* $s" 
}

做的:

PROCESS { 
    $s | foreach-object {
       "* $_"
    }
}

并试图摆脱使用echo(写入输出)的习惯,因为任何未捕获的内容都将为您输出。