我有一个脚本启动一个事件并等待用户按任意键来停止脚本执行。我在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;
}
}
答案 0 :(得分:15)
来自文章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
之后。
答案 1 :(得分:6)
使用计时器类(RIP poshtips)给了我这样的东西:
$Time = [System.Diagnostics.Stopwatch]::StartNew()
while ($NoEvent) {
$CurrentTime = $Time.Elapsed
write-host $([string]::Format("`rTime: {0:d2}:{1:d2}:{2:d2}",
$CurrentTime.hours,
$CurrentTime.minutes,
$CurrentTime.seconds)) -nonewline
sleep 1
#Handle event
if(event){$NoEvent = false}
}
$ NoEvent是你的事件/布尔值(键按func等)。
答案 2 :(得分:6)
这给了我以后的输出:)
$StartTime = $(get-date)
$elapsedTime = $(get-date) - $StartTime
$totalTime = "{0:HH:mm:ss}" -f ([datetime]$elapsedTime.Ticks)
答案 3 :(得分:0)
我很高兴从Xelco52的回答中扩展了这个小功能
$startTime = $(get-date)
write-host "Elapsed:00:00:00"
$NoEvent = $true
While ($NoEvent)
{
Start-Sleep 1
$elapsedTime = new-timespan $startTime $(get-date)
write-host "Elapsed:$($elapsedTime.ToString("hh\:mm\:ss"))"
#Handle event
if(event){$NoEvent = $false}
}