2016-01-22 121 views
1

我有兩個功能之一輸出一組目錄 而且需要接收該設置並對其執行foreach,但是看起來第二個功能只接收其中一個目錄(最後一個)。Powershell:從一個功能到另一個功能的管道值

我在做什麼錯。

Get-Directories { 
    return Get-ChildItem | Where-Object { $_.PSIsContainer -eq $True } 
} 
function Invoke-Build { 
    [CmdletBinding()] 
    Param(
    [Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)] 
    [string[]]$directories 
) 
Write-Output $dir 
foreach ($dir in $directories) { 
    Set-Location $dir 
    Build 
    Set-Location .. 
} 

Get-Directories | Invoke-Build 

輸出雖然只是Get-Directories找到的最後一個目錄。我需要第二個函數接受數組輸入,因爲我打算讓它異步執行任務。

+2

使用'過程{...}'塊。 – PetSerAl

回答

0

PetSerAl的評論是關注的。

我改變了第二功能如下

function Invoke-Build { 
    [CmdletBinding()] 
    Param(
     [Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)] 
     [string[]]$directories 
    ) 
    Begin { Write-Output "Starting" } 
    Process { 
     Set-Location $_ 
     build 
     Set-Location .. 
    } 
    End { Write-Output "Done" } 
+0

您也可以使用'process'塊內的'foreach'來指定一個值數組(當不使用管道時) – Kiran

1

您需要在您的調用,生成功能的處理模塊。

function Invoke-Build 
{ 
    [CmdletBinding()] 
    Param 
    (
    [Parameter(Mandatory = $True, 
       ValueFromPipeline = $True, 
       ValueFromPipelineByPropertyName = $True)] 
    [string[]]$directories 
) 

    PROCESS 
    { 
    Write-Output $directories 
    } 
} 

如果你這樣調用該函數:

"dir1", "dir2", "dir3" | Invoke-Build 

該函數將遍歷目錄一次一個。關於實施管道支架

更多信息可以在這裏找到:http://learn-powershell.net/2013/05/07/tips-on-implementing-pipeline-support/