Другое возможное решение, еще не упомянутое, состояло бы в том, чтобы сохранить ваш основной цикл и зарегистрировать событие таймера для 10-секундного «цикла».
$timer = new-object timers.timer
$action = {
# Edit me... put whatever you want to be done every 10 seconds here instead.
write-host "Timer Elapse Event: $(get-date -Format ‘HH:mm:ss’)" -ForegroundColor Cyan
}
$timer.Interval = 10000 #10 seconds
Register-ObjectEvent -InputObject $timer -EventName elapsed –SourceIdentifier '10secTimer' -Action $action
$timer.start()
while ($true) {
Write-Host 'Append to file...'
Start-Sleep -Seconds 3
}
#to stop run
$timer.stop()
#cleanup
Unregister-Event 10secTimer
Вы также можете использовать один цикл while
и использовать объект Секундомер, чтобы проверить, когда прошло 10 секунд, и затем выполнить другое действие.
$StopWatch = New-Object -TypeName 'System.Diagnostics.Stopwatch'
$StopWatch.Start()
while ($true) {
Write-Host 'Do stuff...' -ForegroundColor Cyan
Write-Host "$($StopWatch.Elapsed.Seconds) seconds elapsed"
Start-Sleep -Milliseconds 1000
if ($StopWatch.Elapsed.Seconds -ge 10) {
# Put everything for your 10 seconds here.
Write-Host 'Do other stuff...' -ForegroundColor Green
$StopWatch.Reset()
$StopWatch.Start()
}
}
$StopWatch.Stop()
Чтобы ответить на «два истинных в одно и то же время», если вы хотите использовать 2 цикла «циклически», как в вашем примере, вам нужно добавить оператор break
во внутренний цикл, еслиВы когда-нибудь захотите вернуться во внешний цикл.
while ($true) {
Write-Host 'Outer loop...'
Start-Sleep -Seconds 3
While ($true) {
Write-Host 'Inner loop...'
break; # If you don't break, you'll never exit the inner loop.
}
}