LastWrite FileSystemWatcher Powershell:通知

时间:2011-10-17 09:46:19

标签: powershell notifications filesystemwatcher

我想在某个文件发生变化时收到通知。它工作正常,但我无法设置NotifyFilter。 “不被识别为cmdlet的名称......” 主要问题是:我的脚本在我的函数中运行了两次。确定了一个变化,然后我得到两次“改变”

function fileChanged ($text) {
  Write-Host $text 
}

$watcher = New-object System.IO.FileSystemWatcher "C:\Users\test\Desktop\"
$watcher.EnableRaisingEvents = $true
$watcher.Filter="*.txt"
$watcher.NotifyFilter = (System.IO.NotifyFilters.LastWrite)

$changed = Register-ObjectEvent $watcher "Changed"  -Action {
  $txt = "changed"
  filechanged($txt)
}

while($true) {
  echo "wartet"
  $null = $watcher.WaitForChanged("Changed")
  start-sleep -s 2
}

3 个答案:

答案 0 :(得分:2)

在代码中更改此项以声明notifyfilter:

$watcher.NotifyFilter = [System.IO.NotifyFilters]::LastWrite

但这不能解决问题,请阅读:

来自VS.NET文档的"Troubleshooting FileSystemWatcher Components"部分......

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

注意:记事本也可能导致其他有趣的事件生成。例如,如果使用ChangeEventFilter指定只想查看属性更改,然后使用记事本写入正在查看的目录中的文件,则会引发事件。这是因为记事本在此操作期间更新了文件的Archived属性。

答案 1 :(得分:0)

WaitForChanged明确使用FileSystemWatcher 同步等待更改。 EnableRaisingEvents正在执行异步等待:当事情发生变化时,将调用事件处理程序。

您正在同步和异步地查找更改。选择一个并使用它,使用两者会混淆一切。

答案 2 :(得分:0)

发现以下内容最为简单:

感谢Derek Newton: http://dereknewton.com/2011/05/monitoring-file-system-changes-with-powershell/

$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $searchPath
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true
$changed = Register-ObjectEvent $watcher "Changed" -Action {
write-host "Changed: $($eventArgs.FullPath)"
}