2016-05-03 18 views
0

ファイルの作成ディレクトリを監視しようとしています。ファイルが作成された場合は、ログファイルに1行書き出し、フォルダの監視を続けます。私は以下のコードを使用していますが、ログファイルには二重のエントリがあります。Usinf System.IO.FileSystemWatcherファイルの作成時にログファイルに書き込む

$actionにブレークを入れると、次のイベントを待つ前に2回実行されていることがわかります。そのため、2行がログファイルに書き込まれます。

どうしたのですか?

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO 
$watcher = New-Object System.IO.FileSystemWatcher 
$watcher.Path = "C:\test-folder" 
$watcher.Filter = "*FINAL*" 
$watcher.IncludeSubdirectories = $true 
$watcher.EnableRaisingEvents = $true 
$watcher.InternalBufferSize = 16384 

### DEFINE ACTIONS AFTER A EVENT IS DETECTED 
$action = { $path = $Event.SourceEventArgs.FullPath 
      $changeType = $Event.SourceEventArgs.ChangeType 
      $logline = "$(Get-Date), $changeType, $path" 
      Add-Content "C:\test-folder\created.log" -value $logline 
      }  
### DECIDE WHICH EVENTS SHOULD BE WATCHED + SET CHECK FREQUENCY 
$created = Register-ObjectEvent $watcher "Created" -Action $action 
# $changed = Register-ObjectEvent $watcher "Changed" -Action $action 
# $deleted = Register-ObjectEvent $watcher "Deleted" -Action $action 
# $renamed = Register-ObjectEvent $watcher "Renamed" -Action $action 
while ($true) {sleep 5} 

ログファイルには、次のようになります...

05/03/2016 11:25:16, Created, C:\test-folder\test1-FINAL-.txt 
05/03/2016 11:25:16, Created, C:\test-folder\test1-FINAL-.txt 
05/03/2016 11:26:10, Created, C:\test-folder\test2-FINAL-.txt 
05/03/2016 11:26:10, Created, C:\test-folder\test2-FINAL-.txt
+0

私によく見えます。ウォッチャーを2回登録していないことは確かですか? –

+0

erm、わからない - もし私がpsシェルを閉じて再オープンするとウォッチャーがクリアされるはずですか? - そして、もし私が "writeとread host"を$ action {中でブレークとして走らせれば、それは2回繰り返すことができます。 ... – grizlyadams

答えて

1

あなたは、このトピックにLastWrite FileSystemWatcher Powershell: notification

をお読みくださいあなたは、単一の作成イベントが複数作成されたイベントを生成することを特定の状況に気づくことコンポーネントによって処理されます。たとえば、FileSystemWatcherコンポーネントを使用してディレクトリ内の新しいファイルの作成を監視し、メモ帳を使用してファイルをテストすると、1つのファイルのみが作成されたにもかかわらず2つのCreatedイベントが生成されることがあります。これは、メモ帳が書き込みプロセス中に複数のファイルシステムアクションを実行するためです。メモ帳は、ファイルの内容を作成した後、ファイルの属性を作成するバッチでディスクに書き込みます。他のアプリケーションも同じように実行できます。 FileSystemWatcherはオペレーティングシステムのアクティビティを監視するため、これらのアプリケーションが起動するすべてのイベントが取得されます。

+0

oh - ok(私はテストファイルを作成するためにNotepad ++を使用しています)私はちょうどファイルコピーを使って試しましたが、ログには1行しか作成されませんでした。 winword(これは実際の環境でファイルを作成する予定です)で試してみました.3つのイベントがありました - ファイル名の2つと単語が作成する〜$ のイベント。だから、#$ファイルを記録しないようにフィルターを入れる必要があります。しかし、それは私のダブルエントリーの問題を解決しません。 私はログファイルの二重のエントリで暮らすことができました - しかし、私は#slackにもそれを使用していますが、私は本当に複数のメッセージを必要としません。 FileSystemWatcherよりも良い方法がありますか? – grizlyadams

+0

別の方法は、自分でフォルダを確認することです。現在のファイルを変数に格納し、compare-objectを使用して新しいファイルがあるかどうかを確認します。新しいファイルがある場合は、if文で必要な処理を行います。 –

+0

はい - 私はそれを考えていましたが、どこから始めるべきかは本当に分かっていませんでした:)しかし、数多くのファイルが追加されているサブフォルダがたくさんあります(私が探しているファイルタイプの多くはありません)。オーバーヘッドがFSWよりも高いと仮定した... – grizlyadams

0

タイムスタンプを使用して、グローバル変数を設定しました。これは、その変数が重複しているかどうかを確認するために比較します。

2番目に離れて作成された潜在的なものとして最良の解決策ではありませんが、依然としてダブルエントリになりますが、私たちの状況では機能します。

ありがとうございます。

関連する問題