Powershell管道foreach-object

时间:2017-10-06 12:45:00

标签: powershell

为什么我不能将foreach-object操作的结果传递给另一个foreach-object操作?我无法运行最后一个ForEach-Object循环。它什么也没输出。

$mailboxstatistics |
Select-Object -First 20 |
Where { $_.FolderPath.Contains("/Inkorg") -eq $True } |
ForEach-Object -Begin{
        Write-Host "Begin"
    } -Process{
        #Write-Host "Process"
        Write-Host $($_.FolderPath)
    } -End{
        Write-Host "End"
    } |
ForEach-Object{
    Write-Host "test"
}

1 个答案:

答案 0 :(得分:2)

编辑我原来的答案:你在问:"为什么管道不允许你从一个ForEach管道到另一个ForEach,"而不是一个实际的解决方案。这需要管道的基本定义。来自

  • PowerShell:Michael Shepard自动执行管理任务; Chendrayan Venkatesan;谢里夫塔拉特;布伦顿J.W. Blawat " PowerShell中的管道是一种从一个命令到另一个命令获取数据的机制。简而言之,从第一个命令输出的数据被视为管道中下一个命令的输入。 "

PowerShell中的管道传递.NET框架对象,而不是可能传递文本的其他类型的shell。因此,基于上面的定义,您期望For-EachObject输出的是下一个序列的管道输入?当您执行Where-Object或Select-Object时,您需要优化集合。您已经说过将对象发送到Write-Host。在ForEach完成后,管道中没有任何东西作为输出。

我不确定流水线菊花链的优势。我可能错了,我通常用变量打破序列。 ForEach将消耗和操作管道中的每个项目,然后生产或输出管道链中的下一个项目?我理解ForEach可以接受管道输入作为对象的集合,例如数组。所以我看到它只使用迭代项目数量的优势,而不是传统的

for($i = 0; $i-lt $collectionOfOjbects.Length; $i++)
{
     Verb-Noun $collectionOfObjects[$i]
}

是否可以先尝试选择/排序精炼,然后将其传递给ForEach迭代?

$myFirst20MailboxStatsInkorg = $mailboxstatistics | Select-Object -First 20 | Where { $_.FolderPath.Contains("/Inkorg") -eq $True } 
#first round of iteration:
$myFirst20MailboxStatsInkorg | ForEach-Object -Begin{
        Write-Host "Begin"
    } -Process{
        #Write-Host "Process"
        Write-Host $($_.FolderPath)
    } -End{
        Write-Host "End"
    }
#second round of iteration
$myFirst20MailboxStatsInkorg | ForEach-Object{
    Write-Host "test"
}