Powershell流水线仅返回集合的最后一个成员

时间:2011-09-17 18:01:07

标签: powershell powershell-v2.0 pipeline

我在管道中运行以下脚本时遇到问题:

Get-Process | Get-MoreInfo.ps1

问题是只显示集合的最后一个进程。如何在以下脚本中使用集合的所有成员:

param(    [Parameter(Mandatory = $true,ValueFromPipeline = $true)]
    $Process
)

function Get-Stats($Process)
{

New-Object PSObject -Property @{
Name = $Process.Processname

}

} 
Get-Stats($Process)

3 个答案:

答案 0 :(得分:1)

试试这个:

param(    [Parameter(Mandatory = $true,ValueFromPipeline = $true)]
    $Process
)

process{
New-Object PSObject -Property @{
Name = $Process.Processname}
}

编辑:

如果你需要一个功能:

function Get-MoreInfo {
param(    [Parameter(Mandatory = $true,ValueFromPipeline = $true)]
    $Process
)


process{
New-Object PSObject -Property @{
Name = $Process.Processname}
}

}

然后你可以使用:

. .\get-moreinfo.ps1 # 

Get-Process | Get-MoreInfo

评论后编辑:

Read about dot sourcing a script

答案 1 :(得分:0)

我只是将Get-MoreInfo创建为过滤器而非功能,您将获得所需的效果。

Filter Get-MoreInfo
{
    param(    [Parameter(Mandatory = $true,ValueFromPipeline = $true)]
         $Process
    )
...

答案 2 :(得分:0)

实际上,Christian的回答和tbergstedt的答案都有效 - 而且它们本质上是等价的。您可以在我最近关于Simple-Talk.com的文章中了解有关如何以及为何的更多信息:Down the Rabbit Hole- A Study in PowerShell Pipelines, Functions, and Parameters

简而言之,以下是重点:

  1. 功能正文包括开始进程结束块。
  2. 未明确指定上述3个块中的任何一个的函数就像所有代码都在 end 块中一样;因此你最初观察到的结果。
  3. 过滤器只是编写没有任何上述3个块的函数的另一种方法,但所有代码都在 process 块中。这就是上述两个答案相同的原因。