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 に増やすことでした。そんなに壊れないで。

画面バッファに関する私の評価は正しいですか? または他の何かが壊れていますか?はいの場合、.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 に答える