PowerShell:Console和SetCursorPosition中的角色动画变得疯狂

时间:2013-10-09 07:09:24

标签: animation powershell visual-studio-2012 msbuild console

专家, 我正在使用msbuild构建一长串Visual Studio项目。在隐藏msbuild输出时,在msbuild完成其工作时会显示基于某些字符的状态和动画。这里我的脚本使用msbuild构建并显示等待动画(你肯定会喜欢这个......):

$anim=@("|","/","-","\","|") # Animation sequence characters
$ReturnCode = @{}
$BuildStatus="Building $(ProjectName)" 

$CursorTop=[Console]::CursorTop #// Cursor position on Y axis
$CursorLeft=$BuildStatus.Length #// Cursor position on X axis 
Write-Host $BuildStatus -ForegroundColor Cyan

#// starting the MsBuild job in background.

$MsbJob = [PowerShell]::Create().AddScript(
{
  param($MsbArgs, $Result)
  & msbuild $MsbArgs | Out-Null
  $Result.Value = $LASTEXITCODE
}
).AddArgument($MsbArgs).AddArgument($ReturnCode)

$async = $MsbJob.BeginInvoke() #// start executing the job.

#// While above script block is doing its job in background, display status and animation in console window.

while (!$async.IsCompleted)
{
    foreach ($item in $anim) #// looping on array containing characters to form animation
    {

       [Console]::SetCursorPosition($CursorLeft + 5,$CursorTop) #//setting position for cursor
       Write-Host $item -ForegroundColor Yellow 
       Start-Sleep -m 50
    }
}

$MsbJob.EndInvoke($async)

大部分时间,它按预期工作,即显示如下状态:

  

构建MyProject(动画角色)..

但突然间,它变成了这样:enter image description here

仅发现解决方案:我能够纠正这是将控制台的屏幕缓冲区大小(控制台属性 - >布局:屏幕缓冲区大小)增加到1024.此外,我还增加窗口大小以填充显示器,它没有像那样破坏。

我对Screen Buffer的评估是否正确?还是别的什么都搞砸了? 如果是,我是否必须实际增加屏幕缓冲区大小,即从我的.psm1脚本中增加。?

任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:5)

默认情况下,Write-Host会在打印字符串后面添加换行符。而不是重新定位光标尝试打印输出而不使用换行符,因此您可以使用退格键(`b)来擦除之前打印的字符:

while (!$async.IsCompleted) {
  $anim | % {
    Write-Host "`b$_" -NoNewline -ForegroundColor Yellow 
    Start-Sleep -m 50
  }
}

答案 1 :(得分:0)

所以,在挖掘了一点之后,我找到了一种方法,我也希望它可以工作,即增加控制台窗口的屏幕缓冲区值,托管我所有的垃圾。所以在我的脚本中添加了这一行似乎阻止了角色动画的分解:

[Console]::SetBufferSize(512,512)

我也试过给它非常低的值,即15,5,是的,我再现了上面的问题。

所以在这个时候,这似乎是一个解决方案。但是,我还在不时地测试它......