2017-05-11 70 views
3

我創建了這個函數來解析特定文本的字段並返回一個自定義對象。爲什麼這個函數不能使用管道變量?

一切工作正常,如果我使用的語法,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

什麼對象類型是$ PassedArray,它包含什麼對象類型(字符串,對象集合,其他)? –

+1

這是一串字符串。 – finalbroadcast

回答

5

支持管道輸入你需要在你的函數的過程塊:

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塊一次。

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

(注:報價已略有修改爲SS64錯誤地指出,不執行過程塊在沒有管道輸入,而在實際上它仍執行一個單一的時間)。

你仍然是正確的,包括ForEach循環,因爲這意味着你支持數組輸入時,它通過參數傳遞。但是,爲了處理通過管道發送的所有輸入,需要一個Process { }塊。

+3

爲了補充這個答案,這是一個[Boe Prox關於這個主題的優秀指南](https://learn-powershell.net/2013/05/07/tips-on-implementing-pipeline-support/) – BenH

+0

這是正確的,但是在回答和編輯之後,根據所做的評論,他正在輸入一個字符串數組,而不是對象。還需要將'[System.Object []] $ VMArray'更改爲'[String []] $ VMArray'和'if($ VM.Description -match' to'if($ VM -match',如果準確的話) –

+0

我可能在這裏忽略了一些東西,但是你會添加過程塊來改變管道的行爲嗎?當我調用函數時,使用與正常參數相同的變量:Get-MachineUser -VMArray $ PassedArray它可以正常工作。我只是忽略了Powershell的行爲,但我認爲在傳遞數組或將它作爲參數之間沒有區別。 – finalbroadcast

相關問題