首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PowerShell中如何让循环每1秒计数1次?

在PowerShell中如何让循环每1秒计数1次?
EN

Stack Overflow用户
提问于 2019-01-06 01:20:18
回答 2查看 785关注 0票数 0

我已经写了一段代码,从1数到20,5开始睡眠,然后继续。但是我需要计数器每秒计数1,所以整个循环需要25秒才能运行。现在只需要7-9秒。

代码语言:javascript
复制
$counter = 0
for ($counter -lt 20)
{
    Start-sleep 0
    $Counter++
    write-host $Counter
    if ($Counter -eq 10)
    {
        Start-sleep 5
    }
    If ($Counter -eq 20)
    {
        Break
    }
}
EN

回答 2

Stack Overflow用户

发布于 2019-01-06 02:15:34

秒表可以用来更好地计时。一旦您达到阈值(10秒),您必须重新启动它。

这种方法唯一的缺点是,如果你是在7秒,然后你在循环中做了一些事情,花了5秒,你将在12秒到达10秒循环(这就是为什么我使用-ge作为条件)。

代码语言:javascript
复制
$StopWatch = New-Object -TypeName 'System.Diagnostics.Stopwatch'
$StopWatch.Start()

For ($Counter = 0;$counter -lt 20) {
    Write-Host '.' -NoNewline
    Start-Sleep -Milliseconds 500 

    if ($StopWatch.Elapsed.Seconds -ge 10) {
        Write-Host ''
        Write-Host "$($StopWatch.Elapsed.Seconds) seconds elapsed... " -ForegroundColor Cyan
        $StopWatch.Restart()
    }

}

或者,您可以将您的主要内容放在一个作业中,这样即使需要2分钟才能完成,10秒循环仍将正确执行。

代码语言:javascript
复制
$MainStuffAction = {
   Start-Sleep -Seconds 20
    Write-Host 'Completed !'
}


$MainStuff = Start-Job -ScriptBlock $MainStuffAction 
$StopWatch = New-Object -TypeName 'System.Diagnostics.Stopwatch'
$StopWatch.Start()

while($true) {
    if ($StopWatch.Elapsed.Seconds -ge 10) {
        Write-Host '10 seconds elapsed!' 

        # We only restart the stopwatch at the end to get our full 10 seconds
        $StopWatch.Restart()
    } 
    elseif ($MainStuff.State -ne 'Running') {
        $MainStuff | Receive-Job
        $MainStuff = Start-Job -ScriptBlock $MainStuffAction 
    }

    Start-Sleep -Milliseconds 500

}
票数 0
EN

Stack Overflow用户

发布于 2019-01-06 07:55:57

这是另一种方法。它使用while结构并显示$Counter$Stopwatch的值,因此您可以清楚地看到它是否正在执行您想要的操作。笑一笑

代码语言:javascript
复制
$Stopwatch = [System.Diagnostics.Stopwatch]::new()
$Stopwatch.Start()

$Counter = 0
# correct for off-by-one
$Threshold = 19
while ($Counter -le $Threshold)
    {
    Start-Sleep -Seconds 1
    $Counter ++
    'Counter = {0:D2}, Seconds = {1:D2}' -f $Counter, $Stopwatch.Elapsed.Seconds
    if ($Counter -eq 10)
        {
        Start-Sleep -Seconds 5
        '{0} {1:D2} Seconds' -f (' ' * 15), $Stopwatch.Elapsed.Seconds
        }
    }

$Stopwatch.Stop()
$Stopwatch.Elapsed.TotalSeconds

输出...

代码语言:javascript
复制
Counter = 01, Seconds = 01
Counter = 02, Seconds = 02
Counter = 03, Seconds = 03
Counter = 04, Seconds = 04
Counter = 05, Seconds = 05
Counter = 06, Seconds = 06
Counter = 07, Seconds = 07
Counter = 08, Seconds = 08
Counter = 09, Seconds = 09
Counter = 10, Seconds = 10
                15 Seconds
Counter = 11, Seconds = 16
Counter = 12, Seconds = 17
Counter = 13, Seconds = 18
Counter = 14, Seconds = 19
Counter = 15, Seconds = 20
Counter = 16, Seconds = 21
Counter = 17, Seconds = 22
Counter = 18, Seconds = 23
Counter = 19, Seconds = 24
Counter = 20, Seconds = 25
25.2769325
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54054338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档