編輯我原來的答覆:你問「爲什麼管道不讓你管從一個的ForEach到另一個的ForEach」,而不是一個實用的解決方案。這需要管道的基本定義。從
- PowerShell:自動執行管理任務Michael Shepard; Chendrayan Venkatesan; Sherif Talaat;布倫頓J.W. Blawat 「在PowerShell中的管道是一種機制,從一個命令獲取數據到另一個。簡單地說,這是第一個命令輸出管道被視爲輸入下一個命令的數據。」
PowerShell中的管道傳遞.NET框架對象,而不是其他類型的可能傳遞文本的shell。所以,根據上面的定義,你期待For-EachObject輸出的結果是下一個序列的流水線輸入嗎?當你在做一個Where-Object或Select-Object時,你正在完善這個集合。您已經聲明對象已發送到寫主機。在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"
}
'Write-Host'不是'Write-Output'。你通常不會使用(明確),只是返回管道本身的值(這與Write-Output調用有相同的效果)。 –
不要害怕打破你的陳述。請在第一個20的內容中設置一個變量,然後將此變量傳遞給第一個foreach,然後將其傳遞給下一個foreach。就你而言,我不明白爲什麼你不會在第一個foreach中執行所有需要的操作。 –
似乎我在對象上使用Write-Host,($ _。FolderPath)是阻止循環傳遞對象的罪魁禍首。謝謝,不知道。有沒有一個適當的命令可以像debug.writeline()一樣工作,如果我想在傳遞管道時打印一個對象屬性值(不會阻塞它)? – Molotch