Powershell: Update current output line

2020-07-06 02:50发布

问题:

is there a way to update the current line of the command output in powershell?

i know how to write to the same line:

Write-Host "hello " -NoNewLine

Write-Host "world!" -NoNewLine

but is there a way to complete replace the current line? something like:

Write-Host "hello "
Write-Host "world!" -ReplaceLine

thanks in advance!


SOLUTION:

Write-Host "hello " -NoNewLine
Write-Host "`rworld!"

回答1:

Use carriage return to return to the start of the line: `r

See this: http://ss64.com/ps/syntax-esc.html

And definition of carriage return: http://en.wikipedia.org/wiki/Carriage_return

If you want to clear a line, that and a load of spaces. Otherwise you can overwrite stuff.

I can't really write up an example here as it's SO's code character, but put it at the start of the "world" string and it should work.

Hope this helps!



回答2:

The solution is to use carriage return while writing to the host, as noted by others. Make sure to use the NoNewLine flag whith write-host or it will not work.

Carriage Return is acheived by using: `r

Here's a small example illustrating this answer:

$up = $true
$finish = $false
$timeout = 50
Write-Host "Updating" -NoNewline
do {
    for ($i=0;$i -le 100;$i++){
        if ($i -eq 100){$up = !$up}
        if ($up){
            $str = ""
            $x=99-$i
            for($z=0;$z -le $i;$z++){$str+="."}
            for($y=0;$y -le $x;$y++){$str+=" "}
            Write-host "`rUpdating$str" -NoNewline
            Start-Sleep -Milliseconds $timeout
        }else{
            $str = ""
            $x=99-$i
            for($y=0;$y -le $x;$y++){$str+="."}
            for($z=0;$z -le $i;$z++){$str+=" "}
            Write-host "`rUpdating$str" -NoNewline
            Start-Sleep -Milliseconds $timeout
        }
    }
    if ($timeout -le 0){$finish = $true}
    $timeout-=10
} until ($finish)
$str = ""
for ($i=0;$i -le 93;$i++){$str+=" "}
Write-Host "`rUpdate Complete!$str"
Read-Host "Press [ENTER] to close this Window"