我有一个脚本,我试图添加管道功能。但是,我看到了奇怪的行为,其中脚本似乎只针对管道中的最终对象运行。例如
param(
[parameter(ValueFromPipeline=$true)]
[string]$pipe
)
foreach ($n in $pipe) {
Write-Host "Read in " $n
}
死简单,不是吗?然后我运行1..10 | .\test.ps1
,它只输出一行Read in 10
。除了复杂性之外,我想要使用它的实际脚本还有更多的参数:
[CmdletBinding(DefaultParameterSetName="Alias")]
param (
[parameter(Position=0,ParameterSetName="Alias")]
[string]$Alias,
[parameter(ParameterSetName="File")]
[ValidateNotNullOrEmpty()]
[string]$File
<and so on>
)
答案 0 :(得分:11)
您需要使用进程{}包装脚本的主体,然后这将允许您处理管道上的每个项目。当为每个项目调用流程时,您甚至可以取消for循环。
所以你的脚本将如下所示:
param(
[parameter(ValueFromPipeline=$true)]
[string]$pipe
)
process
{
Write-Host "Read in " $pipe
}
您可以在此处阅读有关输入处理的内容:Function Input Processing Methods