How can you continue executing a PowerShell script, only if it has been called 3 times in 1 minute?

StackOverflow https://stackoverflow.com/questions/16225876

  •  13-04-2022
  •  | 
  •  

Pergunta

I have a script that is being called via a Windows Scheduled Task, and that task is triggered based on a certain Windows Application Event. It is only critical to execute the script, though, if the event occurs 3 or more times in 1 minute; if the event occurs once a minute, no action should be taken.

I know this can be handled in the script itself. Let's say there are at least 2 new variables I will need:

# 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  

I started outlining an algorithm using a temp file as tracking, but thought there might be a simpler solution that someone can show me. Thanks

Foi útil?

Solução

You could store your execution times in an environment variable.

Before this script will work, you must create the LastExecutionTimes environment variable.

$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

Outras dicas

I would write a text file and a secondary script or function to check it. Where essentially it will call it each time, and then writes the information writes to a text file at call time.

The something like this:

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"
 }

Its missing some variables, but overall should be functional as a supplemental script. Then what your scheduled task actually does is call this, if the time since the $oldTime is over 1 minute, then it over writes the file with the current time and 1 for a $counter variable. If its less than a minute since the first call it then checks the $counter and if it is 3 or higher (could also do -eq ) to 3 then it calls your main script.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top