Powershell-管道 ForEach-Object 时数组计数不正确

Powershell-管道 ForEach-Object 时数组计数不正确

我不明白为什么使用 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)"

相关内容