我创建了这个函数来解析特定文本的字段并返回一个自定义对象。
如果我使用语法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]
}
}
}
}
答案 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 { }
块。