Powershell - что не так с моим таймером обратного отсчета - PullRequest
1 голос
/ 19 июня 2011

У меня есть скрипт счетчика, который ожидает два параметра:

1) секунд ожидания до запуска счетчика.

2) длительность счетчика в секундах.

Например, если я введу 3,10 Мне бы хотелось, чтобы через 3 секунды таймер начал обратный отсчет с 10 до 0 и каждую секунду записывал его на выход.

Это мой сценарий:

$timeBeforeStart = $args[0]
$waitSeconds = $args[1]  

$startTime = get-date
$endTime   = $startTime.addSeconds($waitSeconds)
$timeSpan = new-timespan $startTime $endTime
start-sleep -s $timeBeforeStart
while ($timeSpan -gt 0) 
{
    $timeSpan = new-timespan $(get-date) $endTime
    write-host $([string]::Format("`rTime Remaining: {0:d2}:{1:d2}:{2:d2}",
    $timeSpan.hours, $timeSpan.minutes, $timeSpan.seconds)) 
    sleep 1
}

К сожалению, это не работает, похоже, что сон работает одновременно со счетчиком, а не задерживает счетчик.

PS C:\> c:\555.ps1 3 10 
Time Remaining: 00:00:07
Time Remaining: 00:00:05
Time Remaining: 00:00:04
Time Remaining: 00:00:03
Time Remaining: 00:00:02
Time Remaining: 00:00:01
Time Remaining: 00:00:00
Time Remaining: 00:00:00

Я также пробовал start-sleep -s и результаты там же.

кстати, в чем разница между сном и "start-sleep -s"?

Ответы [ 4 ]

2 голосов
/ 20 июня 2011

Попробуйте так:

$timeBeforeStart = 3
$waitSeconds = 10

Start-Sleep -Seconds $timeBeforeStart

$waitSeconds..0 | Foreach-Object {
    Write-Host "Time Remaining: $_"
    Start-Sleep -Seconds 1
}


Time Remaining: 10
Time Remaining: 9
Time Remaining: 8
Time Remaining: 7
Time Remaining: 6
Time Remaining: 5
Time Remaining: 4
Time Remaining: 3
Time Remaining: 2
Time Remaining: 1
Time Remaining: 0
2 голосов
/ 19 июня 2011

В чем разница между сном и "start-sleep -s" ?

Без разницы, sleep это просто псевдоним Start-Sleep.

К сожалению, это не работает, кажется, что сон работает одновременно со счетчиком вместо задержки счетчика.

Возможно, вы захотите усыпить до запуска счетчика до получения первого $timeSpan:

start-sleep -s $timeBeforeStart

$startTime = get-date
$endTime   = $startTime.addSeconds($waitSeconds)
$timeSpan = new-timespan $startTime $endTime
while ($timeSpan -gt 0) 
{
 # ...
}
1 голос
/ 07 сентября 2017

Попробуйте так:

$timeBeforeStart = 0
$waitSeconds = 60

Start-Sleep -Seconds $timeBeforeStart

$waitSeconds..0 | Foreach-Object {
    Write-Host "`r          Time Remaining: $_ " -NoNewline -foregroundcolor green
    Start-Sleep -Seconds 1
}
0 голосов
/ 14 августа 2013

Это также делает то же самое:

$timeBeforeStart = 3
$waitSeconds = 10

Start-Sleep -Seconds $timeBeforeStart
$endTime = (get-date).addSeconds($waitSeconds)

while ( (get-date) -lt $endTime )
    {
    Write-Host "Time Remaining: $("{0}" -f ([int](new-timespan $(get-date) $endTime).totalseconds))"
    Start-Sleep -Seconds 1
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...