【问题标题】:PowerShell: Character Animation in Console and SetCursorPosition got crazyPowerShell:控制台和 SetCursorPosition 中的角色动画变得疯狂
【发布时间】:2013-10-09 07:09:23
【问题描述】:

专家, 我正在使用 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(动画角色)..

但突然之间,变成了这样:

唯一发现的解决方案:我能够纠正这个是将控制台的屏幕缓冲区大小(控制台属性 --> 布局:屏幕缓冲区大小)增加到 1024。此外,我还增加了填充监视器的窗口大小,它并没有像那样中断。

我对屏幕缓冲区的评估是否正确?或者还有什么正在分手? 如果是,我是否必须务实地增加屏幕缓冲区大小,即从我的 .psm1 脚本内部?

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    默认情况下Write-Host 在打印的字符串后放置一个换行符。与其重新定位光标,不如尝试在没有换行符的情况下打印输出,因此您可以使用退格 (`b) 擦除之前打印的字符:

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

    【讨论】:

    • 只是想知道为什么它会按预期工作一段时间,即它确实重新定位光标,但我无法弄清楚它忘记了光标在 Y 轴上的位置.....
    【解决方案2】:

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

    [Console]::SetBufferSize(512,512)
    

    我还尝试给它一个非常低的值,即 15,5,是的,我重现了上述问题。

    所以在这个时候,这似乎是一个解决方案。但是,我仍在不时对其进行测试...

    【讨论】:

      猜你喜欢
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多