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

Jus*_* R. 1 parameters powershell default

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

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

PROCESS {
    echo "* $s"
}
Run Code Online (Sandbox Code Playgroud)

工作得很好:

PS> my.ps1 foo
*foo

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

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

PROCESS {
    echo "* $s"
}
Run Code Online (Sandbox Code Playgroud)

再次,工作得很好:

PS> my.ps1
*bar
PS> my.ps1 foo
*foo

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

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

PROCESS {
    echo "* $s"
}
Run Code Online (Sandbox Code Playgroud)

结果:

PS> my.ps1
*棒蝙蝠男孩

我期望:

PS> my.ps1
*bar
*bat
*boy

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

Kei*_*ill 6

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

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

PROCESS { 
    $s | %{$_ + " is a " + $_.GetType().Name}
}
Run Code Online (Sandbox Code Playgroud)

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

PS> $arr = 1,2,3
PS> "$arr"
1, 2, 3
PS> $OFS = ', '
PS> "$arr"
1, 2, 3
Run Code Online (Sandbox Code Playgroud)

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

  • 通常,您需要能够考虑集合,而不仅仅是您的管道绑定(按值)参数的标量.标准模板类似于`Process {foreach($ obj in $ pipelineParam){...}}` (2认同)