在 PowerShell ForEach-Object 循环中,是否可以每 1000 个条目将内容转储到日志文件?

问题描述 投票:0回答:1

如果我使用 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 个零件。感谢您的帮助。

powershell foreach
1个回答
0
投票

您可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.