問題是使用Write-Host
cmdlet,它繞過了幾乎所有的管道處理。在這種情況下,它也是不必要的,因爲任何未被cmdlet使用的輸出都會自動傳遞到管道中(或者如果沒有其他任何進一步的信息,則傳送到控制檯)。
這裏是您的代碼重寫爲輸出一個字符串到管道,而不是使用寫主機。這使用PowerShell的字符串子表達式運算符$()
。在控制檯上,它看起來相同,但可以通過管道傳輸到文件或其他cmdlet。
gci -Recurse -Directory | %{ "$($_.FullName) $((gci $_.FullName).Count)" }
您也可能發現將數據放入PSCustomObject中很有用。一旦擁有對象,就可以進行進一步處理,例如基於計數進行排序或篩選。
$folders = gci -Recurse -Directory | %{ [PSCustomObject]@{Name=$_.FullName; Count=(dir $_.FullName).Count }}
$folders | sort Count
$folders | where Count -ne 0
對成語的一些注意事項:dir
是Get-Childitem
的別名,如gci
。使用gci
的-Directory
參數是僅列出目錄的最佳方式,而不是PSIsContainer
檢查。最後,Measure-Object
是不必要的。您可以直接使用文件列表的Count
。
也Write-Host Considered Harmful請參閱從PowerShell中
的發明者