我有一个脚本,它会启动一个事件,然后等待用户按任意键来停止脚本的执行。我试图找到一种方法来显示一个计时器(脚本已经运行了多长时间),同时等待用户在Read-Host上的输入。有什么方法可以实现这一点吗?
这个管用
$Time = [System.Diagnostics.Stopwatch]::StartNew()
while ($true) {
$CurrentTime = $Time.Elapsed
write-host $([string]::Format("`rTime: {0:d2}:{1:d2}:{2:d2}",
$CurrentTime.hours,
$CurrentTime.minutes,
$CurrentTime.seconds)) -nonewline
sleep 1
if ($Host.UI.RawUI.KeyAvailable -and ("q" -eq $Host.UI.RawUI.ReadKey("IncludeKeyUp,NoEcho").Character)) {
Write-Host "Exiting now"
break;
}
}
5条答案
按热度按时间nuypyhwy1#
这给了我所追求的输出:)
sdnqo3pr2#
来自文章Measuring Elapsed Time in Powershell(archived copy):
假设变量
$script:StartTime
在脚本开始时设置,则可以使用以下方法之一确定经过的时间:$elapsedTime = new-timespan $script:StartTime $(get-date)
或
$elapsedTime = $(get-date) - $script:StartTime
这两种方法的工作原理完全相同,都生成一个
System.TimeSpan
对象。因此,使用上面的示例,您可以在Read-Host之前设置
$script:StartTime
,然后调用$elapsedTime = $(get-date) - $script:StartTime
。ukdjmx9f3#
使用一个计时器类(RIP poshtips),我得到了如下的结果:
其中,$NoEvent是事件/布尔值(按键func等)。
7ajki6be4#
我很高兴这个小函数是从Xelco52的答案扩展而来的
lztngnrs5#
TLDR答案
大多数时候
$elapsedTime.TotalSeconds
或$elapsedTime.TotalMilliseconds
是你想要的。