如果我使用 PowerShell ForEach-Object 语句,并将内容存储在变量中,是否可以每 1000 个条目将这些内容转储到日志文件中?
我之所以这么问,是因为我正在处理具有数万行(如果不是数十万行)的文件,并且可能需要几个小时来处理。如果计算机或程序崩溃,我至少希望将其部分内容保存到日志文件中。一次输出每一行似乎也会减慢进程。
示例:
Get-ChildItem -Path "$path" -Recurse -File | ForEach-Object {
$fileinfo = $_
$filehash = (Get-FileHash -LiteralPath $fileinfo.FullName -Algorithm SHA256).Hash
"$filehash".Trim()
} | Format-Table -AutoSize | Out-File -Encoding UTF8 -FilePath $hashlog
我正在考虑使用计数器,但不确定如何只捕获每 1000 个零件。感谢您的帮助。
您可以使用
List<T>
在输出到文件之前缓冲哈希值,并使用匿名函数来处理当 .Count
到达该缓冲区时输出到文件的逻辑。
值得注意:
Format-Table -AutoSize
在您的代码中根本不需要,并且会影响其性能.Trim()
不需要 .Hash
值。Get-ChildItem -Path $path -Recurse -File |
Get-FileHash -Algorithm SHA256 | & {
begin {
# tweak the amount of lines to hold before outputing to file
$buffersize = 1000
$list = [System.Collections.Generic.List[string]]::new($buffersize)
}
process {
$list.Add($_.Hash)
if ($list.Count -eq $buffersize) {
$list.ToArray()
$list.Clear()
}
}
end {
if ($list.Count) {
$list.ToArray()
}
}
} |
Out-File $hashlog -Encoding utf8