Usinf System.IO.FileSystemWatcher在创建文件时写入日志文件

时间:2016-05-03 11:04:44

标签: powershell

我正在尝试监控目录以创建文件。如果创建了一个文件,我想写一行到日志文件并继续监视该文件夹。我正在使用下面的代码,但我在日志文件中得到了一个双重条目。

如果我在$action中放入中断,我可以看到它在等待下一个事件之前经过两次,这就是为什么它将两行写入日志文件。

我有什么问题?

### 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

2 个答案:

答案 0 :(得分:1)

您应该阅读此主题LastWrite FileSystemWatcher Powershell: notification

  

在某些情况下,您可能会注意到单个创建事件会生成由组件处理的多个Created事件。例如,如果使用FileSystemWatcher组件来监视目录中新文件的创建,然后使用记事本创建文件进行测试,即使只创建了一个文件,也可能会看到生成两个Created事件。这是因为Notepad在写入过程中执行多个文件系统操作。记事本批量写入磁盘,创建文件的内容,然后创建文件属性。其他应用程序可以以相同的方式执行。由于FileSystemWatcher监视操作系统活动,因此将拾取这些应用程序触发的所有事件。

答案 1 :(得分:0)

我最终使用时间戳来设置我比较的全局变量,以检查它是否重复。

不是最好的解决方案,因为可能任何创建了第二个区域的东西仍然会导致双重输入,但它适用于我们的情况。

感谢大家的投入。