Powershell:将值从一个函数传递到另一个函数

Powershell:将值从一个函数传递到另一个函数,shell,powershell,pipeline,Shell,Powershell,Pipeline,我有两个函数,一个输出一组目录 需要接收该集合并对其执行foreach,但是第二个函数似乎只接收其中一个目录(最后一个) 我做错了什么 Get-Directories { return Get-ChildItem | Where-Object { $_.PSIsContainer -eq $True } } function Invoke-Build { [CmdletBinding()] Param( [Parameter(Mandatory=$True,Val

我有两个函数,一个输出一组目录 需要接收该集合并对其执行foreach,但是第二个函数似乎只接收其中一个目录(最后一个)

我做错了什么

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目录找到的最后一个目录。我需要第二个函数来接受数组输入,因为我计划让它异步工作。

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" }

您需要在调用构建函数中包含一个进程块

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

  PROCESS 
  {
    Write-Output $directories
  }
}
如果您这样调用函数:

"dir1", "dir2", "dir3" | Invoke-Build
该函数将一次遍历一个目录


有关实现管道支持的更多信息,请参见此处:

使用
进程{…}
块。您还可以在
进程
块内使用
foreach
来指定值数组(不使用管道时)