以下のコードでは、action.bat - ファイル名を引数として渡して Java プロセスを呼び出し、log.txt - ファイル名がタイムスタンプで作成された行をログに記録します。
完全に機能する10個のtxtファイルをドロップしてこのスクリプトをテストしています。このテストを数回繰り返したところ、log.txtが更新され、action.batも正しく呼び出されました。
ただし、この filewatcher を 4 時間実行したままにし、10 個の新しいテキスト ファイルをドロップすると、log.txt のみが更新され、action.bat ファイルは呼び出されません。
再び、powershell を強制終了してスクリプトを再起動し、10 個の新しいファイルで再度テストすると、問題なく動作しました。
4時間待ってもStart-processが呼び出されないのはなぜですか? しかし、ログステートメントは実際に更新されます
私のコードはnet event filewatch.ps1に似ています
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "D:\code\Apps\input"
$watcher.Filter = "*.txt"
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true
### DEFINE ACTIONS AFTER A EVENT IS DETECTED
$action = {
$path = $Event.SourceEventArgs.FullPath
$changeType = $Event.SourceEventArgs.ChangeType
$logline = "$(Get-Date), $changeType, $path"
Add-content "D:\code\Apps\log.txt" -value $logline
Start-process -Filepath D:\code\Apps\action.bat $path -Wait -passthru;
}
### DECIDE WHICH EVENTS SHOULD BE WATCHED + SET CHECK FREQUENCY
$created = Register-ObjectEvent $watcher "Created" -Action $action
while ($true) {sleep 10}