我不明白为什么使用 ForEach 时可以获得正确的数组计数,而通过管道传输到 ForEach-Object 时却无法获得。管道计数始终为 0。
正确數字:
$hash = @(Get-ChildItem C:\Dir -Recurse -Include *.txt | Where {$_.length -gt 0})
ForEach ($i in @hash) {
Write-Host = $i.BaseName
}
"Array Count = $($hash.Count)"
输出:
File1.txt
File2.txt
Array Count = 2
错误计数:
$hash = @(Get-ChildItem C:\Dir -Recurse -Include *.txt | Where {$_.length -gt 0}) | ForEach-Object {
Write-Host $_.BaseName
}
"Array Count = $($hash.Count)"
输出:
File1.txt
File2.txt
Array Count = 0
答案1
在第二种表述中,ForEach-Object
正在消耗 所发现的值,
Get-ChildItem
并且没有返回任何有用的值$hash
。
您应该将整个分配括$hash
在括号中,以便在被抓取之前对其进行评估ForEach-Object
。
这是在我的测试中对我有用的配方:
($hash=@(Get-ChildItem -Path "C:\Temp\*" -Include "*.jpg") | Where {$_.length -gt 0}) | ForEach-Object { Write-Host $_.BaseName }
答案2
在第二个示例中(输入$hash -eq $null
以验证),$hash 为空。管道的输出被循环中的 Write-host“消耗”——没有剩余的内容可以分配给 $hash。如果您希望将名称分配给 $hasn 并显示在控制台上,则可以使用以下方法:
$hash = @(Get-ChildItem c:\dir -Recurse -Include *.txt | Where {$_.length -gt 0}) | ForEach-Object {
$_.BaseName # continues through pipeline to populate $hash
write-host $_.basename
}
"Array Count = $($hash.Count)"