如何编辑已使用PowerShell写入控制台的文本?

如何编辑已使用PowerShell写入控制台的文本?,powershell,Powershell,例如,robocopy将显示正在复制的文件的百分比。百分比将更改,而无需向控制台写入更多输出。当已经写入控制台的文本被修改时,我如何模拟相同的行为?这个答案完全归功于@Bill\u Stewart $text = "Lorem ipsum dolor sit amet" Write-Host $text -NoNewLine Start-Sleep -s 2 for ($i = 0; $i -lt $text.Length; $i++){ Write-Host `b -NoNewLine

例如,robocopy将显示正在复制的文件的百分比。百分比将更改,而无需向控制台写入更多输出。当已经写入控制台的文本被修改时,我如何模拟相同的行为?

这个答案完全归功于@Bill\u Stewart

$text = "Lorem ipsum dolor sit amet"
Write-Host $text -NoNewLine
Start-Sleep -s 2
for ($i = 0; $i -lt $text.Length; $i++){
    Write-Host `b -NoNewLine
}
Write-Host "consectetur adipiscing elit"

你可以试试这样的。它使用
$host.UI.RawUI.CursorPosition
确定控制台文本当前正在写入的位置,并对其进行操作 覆盖以前编写的文本

简单测试

我已经将您的“Lorem ipsum”示例改编为使用
$host.UI.RawUI.CursorPosition

$text=“Lorem ipsum dolor sit amet”
$origpos=$host.UI.RawUI.CursorPosition
写入主机$text-NoNewLine
开始睡眠-s4
$host.UI.RawUI.CursorPosition=$origpos
写主持人“献祭精英”
以下示例将循环
$scroll
中的字符,给人一种旋转行的印象。所有这一切只是运行一个sleep命令10秒钟。根据您的需要,您显然不需要运行所有这些代码

$scroll=“/-\\\124;/-\\\ 124;”
$idx=0
$job=Invoke命令-ComputerName$env:ComputerName-ScriptBlock{Start Sleep-Seconds 10}-AsJob
$origpos=$host.UI.RawUI.CursorPosition
$origpos.Y+=1
而($job.State-eq“Running”)-和($job.State-ne“NotStarted”))
{
$host.UI.RawUI.CursorPosition=$origpos
写入主机$scroll[$idx]-非脱机
$idx++
if($idx-ge$scroll.Length)
{
$idx=0
}
开始睡眠-100毫秒
}
#这是过度清除活动指示灯。
$host.UI.RawUI.CursorPosition=$origpos
写入主机“完成”

注意事项:此测试和测试都不会按照ISE中的预期工作。此外,如果使用不当,您的光标可能会在使用后出现在一个奇怪的地方

您的答案可以缩短为:

$text = "Lorem ipsum dolor sit amet"
Write-Host -NoNewLine "$text`r"
Start-Sleep -Seconds 2
Write-Host -NoNewLine ("`b" * $text.Length)
Write-Host "consectetur adipiscing elit"

使用
Write Host
`r
作为换行符,使用
`b
作为退格符。您也可以使用
-NoNewLine
参数在不终止换行的情况下输出。@Bill_Stewart所以我猜在robocopy的示例中,他们计算他们写入的字符数,然后计算该次数,然后用新的百分比重写该行?