流水线化内容到自己的功能

时间:2014-11-15 09:21:23

标签: function powershell pipeline

我试图编写一个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 提前致谢

2 个答案:

答案 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