我正在组合一个小演示,我希望一个控制台窗口显示当前状态。这是我的第一次迭代:
clear-host; while (1 -eq 1) { git log --graph --oneline; start-sleep -s 1; clear}
不幸的是,这会导致文字"闪烁"屏幕清除时每秒在屏幕上,然后替换为下一个结果。不仅美观上令人不愉快,它虽然很少见,对于一些毫无戒心的观众来说可能是危险的。所以我的下一次尝试是这样的:
clear-host; while (1 -eq 1) { git log --graph --oneline; start-sleep -s 1; [Console]::CursorTop=0;[Console]::CursorLeft=0;}
现在没有闪光,但只是向下拖动屏幕就不会清除更长的线条。
有人能想出一种方法来获得两全其美吗?当我有屏幕时清除屏幕,但没有重复闪烁?
答案 0 :(得分:2)
您可以继续沿着控制台光标操作的路径继续,但PowerShell并非专门针对此方案而设计。
更好的选择是使用Write-Progress
来显示真实的进度信息。
$activity = "Git 'er done"
for() {
$result = & git log --graph --oneline
Write-Progress -Activity $activity -Id 1 -Status ($result -join ', ')
Start-Sleep -Seconds 1
}
Write-Progress -Activity $activity -Id 1 -Completed
(品尝季节)
我-join
$result
的原因是,在我的回购中,git命令本身返回3行,而$result
是一个数组。您可能想要决定如何处理特定情况,但请注意,$result
可以是一个数组,而Write-Progress
将不接受。{/ p>
Write-Progress
在ISE中显示图形进度条,但在控制台主机(powershell.exe
)和PowerShell Web Access中显示基于文本的进度条。换句话说,特定的PowerShell 主机应用程序决定了信息的显示方式,但它以支持的,定义的方式提供。
这意味着Write-Progress
应该可以在任何环境中工作(它可能不会发生任何事情,或者什么也不显示,但它不应该崩溃)。
相比之下,直接控制台操作可能仅适用于ISE和控制台主机(不可否认它们可能是您唯一关心的主机),但如果您的代码突然托管在某个C#应用程序的运行空间中,则可能只是错误输出(我实际上不知道)。