0

Windows スケジュール タスクを介して呼び出されるスクリプトがあり、そのタスクは特定の Windows アプリケーション イベントに基づいてトリガーされます。ただし、スクリプトを実行することが重要なのは、イベントが 1 分間に 3 回以上発生した場合のみです。イベントが 1 分に 1 回発生する場合、アクションは実行されません。

これはスクリプト自体で処理できることを知っています。必要な新しい変数が少なくとも 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  

一時ファイルを追跡として使用するアルゴリズムの概要を説明し始めましたが、誰かが私に示すことができるより簡単な解決策があるかもしれないと考えました. ありがとう

4

2 に答える 2

1

実行時間を環境変数に保存できます。

このスクリプトが機能する前に、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
于 2013-04-26T14:39:18.620 に答える
0

テキスト ファイルと、それをチェックするための補助的なスクリプトまたは関数を作成します。基本的に毎回呼び出し、呼び出し時に情報をテキスト ファイルに書き込みます。

このようなもの:

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 分を超えている場合は、現在の時刻と$counter変数の 1 でファイルを上書きします。最初の呼び出しから 1 分未満の場合は をチェックし、$counterそれが 3 以上 ( も可能-eq) である場合は、メイン スクリプトを呼び出します。

于 2013-04-26T01:40:38.533 に答える