只有在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
我会写一个文本文件和一个辅助脚本或函数来检查它。实际上每次都会调用它,然后在通话时将信息写入文本文件。
的是这样的:
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,则它会调用您的主脚本。
3或更高的检查应该是'$计数器-ge 3'和'$ counter'应在检查之前由于存在导致脚本来运行新的事件增加。即使只存储一次也不行。如果每隔40秒发生3个事件,则计数器将增加到3,但从第一事件到第三事件的时间将是1分20秒。 – Rynant 2013-04-26 14:47:26
@Rynant是的,谢谢并更新。 – 2013-04-26 15:56:36
我喜欢env变量解决方案,谢谢 – 2013-04-26 19:39:19
仅供参考,我无法获取环境变量来保存并继续下一次调用脚本(新的powershell实例)。所以我更新了脚本以使用替代的get/set方法:'$ envTimes = [Environment] :: GetEnvironmentVariable(“LastExecutionTimes”,“User”)''和'[Environment] :: SetEnvironmentVariable(“LastExecutionTimes”,“$ envTimes “,”User“)'这个工作,并且不需要事先添加变量。 – 2013-04-26 22:42:53