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

时间:2018-09-17 15:11:21

标签: powershell pipe 7zip

我有一段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

此刻控制台输出如下:

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

非常感谢!

2 个答案:

答案 0 :(得分:4)

您可以使用.Net System.Console类:

[System.Console]::SetCursorPosition(0, [System.Console]::CursorTop)

因此您的代码必须是:

& $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
}

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

答案 1 :(得分:1)

marsze's helpful answer效果很好,但是有一个更简单的替代方法,它使用CR字符(<div> <p>chatter</p> </div>)将光标位置重置为行的开头。

这是一个简单的演示,它在同一行上打印数字1到10:

"`r"
正如Bacon Bits所指出的那样,

1..10 | ForEach-Object { Write-Host -NoNewline "`r$_"; Start-Sleep -Milliseconds 100 } 而不是[Console]::Write(...)也是有效的。

但是,存在相同的约束:如果先前的输出行恰好是更长,则多余的字符会 liner

也要解决此问题,必须将任何输出行填充到控制台窗口的缓冲区宽度的长度:

Write-Host -NoNewline ...