我有一段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
非常感谢!
答案 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 ...