只有在1分钟内调用3次PowerShell脚本时,如何继续执行PowerShell脚本?

问题描述:

我有一个正在通过Windows计划任务调用的脚本,该任务是基于某个Windows应用程序事件触发的。但是,如果事件在1分钟内出现3次或更多次,执行该脚本至关重要;如果事件每分钟发生一次,则不应采取任何行动。只有在1分钟内调用3次PowerShell脚本时,如何继续执行PowerShell脚本?

我知道这可以在脚本本身处理。比方说,至少有2个新的变量,我将需要:

# 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 

我开始勾画使用临时文件作为跟踪算法,但认为有可能是一个简单的解决方案,有人能告诉我。谢谢

您可以将执行时间存储在环境变量中。

在此脚本生效之前,您必须创建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 
+0

我喜欢env变量解决方案,谢谢 – 2013-04-26 19:39:19

+0

仅供参考,我无法获取环境变量来保存并继续下一次调用脚本(新的powershell实例)。所以我更新了脚本以使用替代的get/set方法:'$ envTimes = [Environment] :: GetEnvironmentVariable(“LastExecutionTimes”,“User”)''和'[Environment] :: SetEnvironmentVariable(“LastExecutionTimes”,“$ envTimes “,”User“)'这个工作,并且不需要事先添加变量。 – 2013-04-26 22:42:53

我会写一个文本文件和一个辅助脚本或函数来检查它。实际上每次都会调用它,然后在通话时将信息写入文本文件。

的是这样的:

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,则它会调用您的主脚本。

+0

3或更高的检查应该是'$计数器-ge 3'和'$ counter'应在检查之前由于存在导致脚本来运行新的事件增加。即使只存储一次也不行。如果每隔40秒发生3个事件,则计数器将增加到3,但从第一事件到第三事件的时间将是1分20秒。 – Rynant 2013-04-26 14:47:26

+0

@Rynant是的,谢谢并更新。 – 2013-04-26 15:56:36