为什么这个函数不能使用管道变量?

时间:2017-05-11 21:24:26

标签: powershell piping

我创建了这个函数来解析特定文本的字段并返回一个自定义对象。

如果我使用语法Get-MachineUser -VMArray $PassedArray,一切正常,但如果我管道数组$PassedArray | Get-MachinesUser它就不起作用。

我和我的团队中的某个人一起工作,我们发现当我们传递数组时,它只处理数组中的最后一个条目。我不介意使用其他语法,但我很好奇我有什么错误导致管道无法工作。

function Get-MachinesUser{
    param (
        [parameter(Mandatory=$true, ValueFromPipeline=$true)]
        [System.Object[]] $VMArray
    )
    foreach($vm in $VMArray){
        if($VM.Description -match '.*(ut[A-Za-z0-9]{5}).*'){
            [PSCustomObject]@{
            "Name" = $vm.Name  
            "User" = $Matches[1]
            }
        }
    }
}  

1 个答案:

答案 0 :(得分:6)

要支持管道输入,您需要在函数中使用过程块:

function Get-MachinesUser{
    param (
        [parameter(Mandatory=$true, ValueFromPipeline=$true)]
        [System.Object[]] $VMArray
    )
    Process{
        foreach($vm in $VMArray){
            if($VM.Description -match '.*(ut[A-Za-z0-9]{5}).*'){
                [PSCustomObject]@{
                "Name" = $vm.Name  
                "User" = $Matches[1]
                }
            }
        }
    }  
}
  

<强>过程

     

此块用于为记录提供逐个记录的处理   功能。该块可能会被使用多次,   取决于功能的输入。例如,如果功能   是管道中的第一个命令,将使用Process块   一度。如果该函数不是管道中的第一个命令,   对于函数的每个输入,Process块都使用一次   从管道接收。

     

来源:https://ss64.com/ps/syntax-function-input.html

     

(注意:引用稍作修改,因为SS64错误地指示在没有管道输入的情况下不执行进程块,而实际上它仍然执行一次)。

包含ForEach循环仍然是正确的,因为这意味着在通过参数时支持数组输入。但是,为了在通过管道发送时处理所有输入,需要Process { }块。