Как продолжить выполнение сценария 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, то он вызывает ваш основной сценарий.