我试图编写一个powershell函数,通过piplining从get-content命令行开关接收文件列表并处理它们。 管道如下所示:
get-content D:\filelist.txt | test-pipeline
为简单起见,下面的函数应该只显示文本文件的每一行。
function test-pipeline
{
<#
.Synopsis
#>
[CmdletBinding( SupportsShouldProcess=$true)]
Param([Parameter(Mandatory = $true,
ValueFromPipeLine = $true)]
[array]$filelist
)
foreach ($item in $filelist)
{
$item
}
}
我的文件列表是一个普通的.txt文件,看起来像这样。
line 1
line 2
line 3
line 4
line 5
无论我输入什么类型的参数函数,它都无法工作,只显示$ filelist变量中文本文件的最后一行。有人可以帮忙吗? Powershell版本是v2 提前致谢
答案 0 :(得分:3)
您只看到最后一行的原因需要深入了解具有管道功能的PowerShell功能的本质。在没有Swonkie提到的显式开始/进程/结束块的情况下,函数中的所有代码都在end
块中运行,就好像你写的那样:
function test-pipeline
{
[CmdletBinding()]
Param(
[Parameter(ValueFromPipeLine = $true)][array]$filelist
)
END {
$filelist
}
}
但$filelist
作为管道变量,在输入管道数据时只有当前值;当管道输入用完时,end
块会运行,因此$filelist
只包含最后一个值。只需将end
块更改为process
块 - 它为管道中的每个值运行,它将为您提供所需的输出:
function test-pipeline
{
[CmdletBinding()]
Param(
[Parameter(ValueFromPipeLine = $true)][array]$filelist
)
PROCESS {
$filelist
}
}
请注意,您不需要任何循环 - 管道已经提供了&#34;循环&#34;。
这只是处理管道数据的几种方法之一。这是一个接近的变体,它有点短:使用filter
代替function
,因为没有显式块的filter
就像所有代码都在{{1}中一样阻止。
process
为了深入研究流水线编写功能的迷人而神秘的世界,请看一下我在Simple-Talk.com上发表的深入分析Down the Rabbit Hole: A Study in PowerShell Pipelines, Functions, and Parameters。享受您的PowerShell冒险!
答案 1 :(得分:1)
而不是功能尝试过滤器:
filter Test-Pipeline {
...
}
这基本上是一个带有处理块的函数(您需要处理管道对象)。或者,您可以使用此块和可选的开始和结束块编写函数:
function Test-Pipeline {
begin {
}
process {
...
}
end {
}
}
更多信息:http://technet.microsoft.com/en-us/magazine/hh413265.aspx