我有一个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有所不同)。
答案 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(写入输出)的习惯,因为任何未捕获的内容都将为您输出。