将 PowerShell 输出字符串覆盖到同一行

Unl*_*me9 6 powershell 7zip pipe

我有一段 PS 代码,它获取 7-Zip 提取输出并将其过滤下来,以便仅打印百分比“%”进度更新行。我已经设法将其减少到仅百分比输出:

& $7ZipPath "x" $filePath "-o$extractionPath" "-aos" "-bsp1" | out-string -stream | Select-String -Pattern "\d{1,3}%" -AllMatches | ForEach-Object { $_.Matches.Value } | Write-Host -NoNewLine
Run Code Online (Sandbox Code Playgroud)

目前控制台输出如下所示:

0%1%5%9%14%17%20%23%26%31%37%43%46%48%50%52%54%56%59%61%63%65%67%70%72%74%76%78%80%81%82%83%85%86%87%89%90%91%92%94%95%96%97%98%99%

有没有办法将这些输出保持在同一行的同一位置,使它们相互覆盖?这很棘手,因为输出是从 7-Zip 应用程序通过管道传输的。恐怕我无法使用,Expand-Archive因为我正在处理.7z文件

非常感谢!

mar*_*sze 4

您可以使用 .NetSystem.Console类:

[System.Console]::SetCursorPosition(0, [System.Console]::CursorTop)
Run Code Online (Sandbox Code Playgroud)

所以你的代码必须是:

& $7ZipPath "x" $filePath "-o$extractionPath" "-aos" "-bsp1" | out-string -stream | Select-String -Pattern "\d{1,3}%" -AllMatches | ForEach-Object { $_.Matches.Value } | foreach {
    [System.Console]::SetCursorPosition(0, [System.Console]::CursorTop) 
    Write-Host $_ -NoNewLine
}
Run Code Online (Sandbox Code Playgroud)

注意:只要下一个输出等于或大于您的情况,这就是您所需要的。否则,您必须先清除最后的输出。

  • 如果您不想插入最后的回车符,则可以将“-End { Write-Host }”添加到最终的 ForEach-Object,因为这可能会阻止提示覆盖进度输出。我相信如果您愿意,您也可以使用 `[Console]::Write()` 和 `[Console]::WriteLine()` 而不是 Write-Host 。 (2认同)