2016-01-22 124 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/