远程写入文件时,网络共享上的 Powershell System.IO.FileSystemWatcher 不起作用

标签 powershell filesystemwatcher

我需要查看文件何时写入目录。该目录位于 Windows 2003 服务器上的映射网络驱动器上。如果我将文件复制到服务器上的此目录中,它就可以工作。如果我远程写入文件,则不起作用。远程写入文件时我该怎么做才能使其正常工作?我想将其保留为事件通知,但如果需要,将更改为轮询方法。如果这是正确的方法,我需要一些最佳实践建议。欢迎我了解有关 Windows 文件写入通知如何工作的任何详细信息。

示例代码:

$watchFolder = "Z:\watched";
$filter = "*.data";
$watcher = New-Object System.IO.FileSystemWatcher $watchFolder, $filter
$watcher.EnableRaisingEvents = $true

$created = Register-ObjectEvent $watcher Created -Action {
   write-host "Found: $($eventArgs.FullPath)"
}

我的经验水平:salt unix admin,Windows 开发新手。

最佳答案

FileSystemWatcher 中有两种“过滤器”类型的规范,“Filter”字符串和“NotifyFilter”参数。您传递给行中的 ctor 的 $filter 参数

$watcher = New-Object System.IO.FileSystemWatcher $watchFolder, $filter

仅设置“过滤器”字符串,该字符串仅确定观察者的“名称”过滤器。您还需要设置 NotifyFilter 参数来指定您正在监视的更改类型。这可以在同一行完成:

$watcher = New-Object System.IO.FileSystemWatcher $watchFolder,$filter  -Property @{IncludeSubdirectories = $false; InternalBufferSize = 16384; EnableRaisingEvents = $true; NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}

我还添加了一些您应该设置的其他属性。 “InternalBufferSize”是修复错误的一种技巧 - 我不记得错误的详细信息,但最好将其放入(谷歌了解详细信息。)

顺便说一句,即使进行了这些修复,我也遇到了与您类似的问题:监视网络驱动器上的文件(无论您是否映射它并使用该映射进行访问)是不稳定的。此外,如果您正在监视的目录在监视期间消失(并可能重新出现),filesystemwatcher 中也存在已知错误 - filesystemwatcher 将不会恢复,除非指定了超时。

所以,也许我的改变会解决你的问题,也许不会。如果您发现的问题解决方案与我在这里发布的内容不同,您是否介意发布,因为即使我发布的内容也不足以解决我的问题,这听起来与您的问题相似。谢谢。

关于远程写入文件时,网络共享上的 Powershell System.IO.FileSystemWatcher 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20389702/

相关文章:

xml - 使用 Powershell 编辑 .XML 文件,编码

events - 我如何知道 VBA 宏中的文件已被修改?

c# - FileSystemWatcher 类 - 排除目录

c# - filesystemwatcher 多个文件

powershell - 过滤器中的 WQL 不起作用

powershell - 在Powershell的2列中显示CSV文件

c# - 如何对 FileSystemWatcher 事件进行单元测试?

用于读取大量文件的 C# 守护进程

powershell - 如何递归删除PowerShell中的所有空文件夹?

powershell - 仅打印 PowerShell 对象的属性名称