Как продолжить выполнение сценария PowerShell, только если он был вызван 3 раза за 1 минуту?

У меня есть сценарий, который вызывается с помощью запланированной задачи Windows, и эта задача запускается на основе определенного события приложения Windows. Впрочем, очень важно выполнить скрипт, если событие происходит 3 или более раз за 1 минуту; если событие происходит раз в минуту, никаких действий предпринимать не следует.

Я знаю, что это может быть обработано в самом сценарии. Допустим, есть как минимум две новые переменные, которые мне понадобятся:

# time window, in seconds
$maxTime = 60

# max number of times this script needs to be called, within $maxTime window, 
# before executing the rest of the script
$maxCount = 3  

Я начал обрисовывать алгоритм, используя временный файл в качестве отслеживания, но подумал, что может быть более простое решение, которое кто-то может показать мне. Спасибо

2 ответа

Решение

Вы можете хранить время выполнения в переменной окружения.

Прежде чем этот скрипт будет работать, вы должны создать переменную среды LastExecutionTimes.

$maxTime = 60
$maxCount = 3
$now = Get-Date

# Get execution times within the time limit.
$times = @($env:LastExecutionTimes -split ';'| 
            Where-Object {$_ -and $now.AddSeconds(-1 * $maxTime) -lt $_})

$times += '{0:yyyy-MM-dd HH:mm:ss}' -f $now
$env:LastExecutionTimes = $times -join ';'

if($times.Length -lt $maxCount) {return}

# Reset the execution times
$env:LastExecutionTimes =''

Write-Host 'Continue Script' -ForegroundColor Yellow

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

Примерно так:

if(!((Get-Date).AddMinutes(-1) -lt $oldTime))
 {
    $CurDate = Get-Date
    "$CurDate, 1" | out-File "TheCheck.txt"
 }
 else 
 {
  $counter++
  if($counter -ge 3) {Call WorkerFunction}
   else{
    "$oldTime, $counter" | Out-File "TheCheck.txt"
 }

В нем отсутствуют некоторые переменные, но в целом он должен быть функциональным в качестве дополнительного сценария. Тогда то, что на самом деле делает ваша запланированная задача, это вызвать это, если время с момента $oldTime больше 1 минуты, затем перезаписывает файл с текущим временем и 1 для $counter переменная. Если с момента первого звонка прошло меньше минуты, он проверяет $counter и если это 3 или выше (также может сделать -eq) до 3, то он вызывает ваш основной сценарий.

Другие вопросы по тегам