1

专家们,我正在使用 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。此外,我还增加了窗口大小以填充监视器,但它没有不要那样打破。

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

任何帮助将非常感激。

4

2 回答 2

5

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

while (!$async.IsCompleted) {
  $anim | % {
    Write-Host "`b$_" -NoNewline -ForegroundColor Yellow 
    Start-Sleep -m 50
  }
}
于 2013-10-09T14:21:35.070 回答
0

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

[Console]::SetBufferSize(512,512)

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

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

于 2013-10-11T07:26:29.610 回答