问题是使用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中
的发明者