我想在某个文件发生变化时收到通知。它工作正常,但我无法设置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
}
答案 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)"
}