Powershell - 如何删除超过 X 个字符的行?

Powershell - 如何删除超过 X 个字符的行?

我有一些文本文件,Powershell 可以快速处理,但前提是行数足够短(少于 4,000 个字符)。

如果我的文本文件的任何一行都有超过 8,000 个字符,那么通常需要 20 秒的时间可能需要 6 个小时!

是否有一个简单的 Powershell 命令可以删除任何超过 4,000 个字符的行?

编辑:在批处理文件中运行,这看起来应该可以工作,但实际上却不行(根据下面 Keith Miller 的回答,适合在批处理文件中使用)

start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object { $skipped = 0 $file = $_.FullName $result = switch -File $file { { $_.Length -le 4000 } { $_ } default { $skipped++ } } if ($skipped) $result | Set-Content -Path $file -Force} }"

答案1

我使用这个(在批处理文件中)让它工作

start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) | Where-Object {$_.Length -lt 4000} | Set-Content $_.FullName}"

Keith Miller 首先回答了这个问题,但答案在已发布的评论中,所以我无法将其标记为已解决。也感谢 Theo。

答案2

您可以使用switch -File逐行循环遍历文件内容来以最快的速度完成此操作,当发现长度超过 4000 个字符的行时,只需跳过它们:

(Get-ChildItem -Path 'Path\To\The\Files' -Filter '*.txt' -File) | ForEach-Object {
    $skipped = 0
    $file = $_.FullName
    $result = switch -File $file {
        { $_.Length -le 4000 } { $_ }  # only output lines that are less or equal to 4000 characters
        default { $skipped++ }         # count the lines that were longer than 4000 characters
    }
    if ($skipped) {
        # rewrite the file only if there were lines removed
        Write-Host "Replacing file '$file'"
        $result | Set-Content -Path $file -Force
    }
}

括号内的括号Get-ChildItem用于强制在处理文件之前完成文件枚举。否则,Get-ChildItem 可能会拾取已被重写的文件

相关内容