2013-07-02 32 views
-1

想想一個非常好的標題很難。如果你能想到更好的標題,請隨時編輯它。參數化數組在所有情況下都不能正常工作

Powershell的3

下面是一個示例函數:

Function New-Cmdlet 
{ 
    [CmdletBinding(SupportsShouldProcess=$True)] 
    Param([Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)] 
       [String[]]$ComputerName) 
    BEGIN 
    {    
     Write-Verbose -Message "Cmdlet is starting." 
    } 
    PROCESS 
    {    
     Write-Verbose -Message "Beginning Process block on $ComputerName" 
    } 
    END 
    { 
     Write-Verbose -Message "Running End block." 
    } 
} 

現在,如果我跑Get-Content C:\hosts.txt | New-Cmdlet,過程塊在HOSTS.TXT發現每個條目運行一次。這是好的和正確的。

如果我運行"host1","host2" | New-Cmdlet,那麼PROCESS塊將運行兩次;一次爲host1,一次爲host2。再次,這是好的和正確的。

但是,如果我運行New-Cmdlet -ComputerName "host1","host2"或幾乎任何其他變體,我可以想到像New-Cmdlet -ComputerName @("host1","host2") ...... PROCESS塊只運行一次。哪個不好。

任何想法我能做些什麼才能在每種情況下正常工作?

回答

1

$ ComputerName是一個數組。

新Cmdlet的-ComputerName「主機1」,「主機2」 - 這通過在一個陣列中 - 你的代碼被執行一次,並返回

您應該修改代碼以遍歷$計算機名稱代碼內

+0

謝謝。我想我只是感到困惑,因爲當我使用管道時,Process程序塊表現爲它自己的foreach循環,所以在它內部添加一個foreach循環似乎是多餘的。 –

1

幾年前,我在TechNet論壇上問過同樣的問題。

http://social.technet.microsoft.com/Forums/windowsserver/en-US/fc0bf987-a4f2-4ebb-9ff3-8c4acef346ed/process-pipeline-input-and-parameter-input-the-same-way

我想相同的行爲在拷貝項目

複製項目-Path 「FILE.TXT」, 「FILE2.TXT」 -Destination -Path參數 「d:\」

「File.txt」,「File2.txt」| Copy-item -Destination「D:\」

就像你說的......當從管道接收到內容時,我們必須循環一個已經是標量的冗餘值。像這樣...

Function DoStuff { 

    Param ( 
     [Parameter(Mandatory=$True, ValueFromPipeline=$True)][string[]]$Item 
    ) 

    Process { 
     $Item | ForEach-Object { 
      # Do the stuff here 
     } 
    } 
} 

我剛剛看了ATT微軟的拷貝項命令用JustDecompile,看看微軟是如何做到的。它們以同樣的方式執行... Path-parameter是一個數組,它們在其ProcessRecord實現中循環。

相關問題