为什么我不能将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"
}
答案 0 :(得分:2)
编辑我原来的答案:你在问:"为什么管道不允许你从一个ForEach管道到另一个ForEach,"而不是一个实际的解决方案。这需要管道的基本定义。来自
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"
}