Powershell:从 FileSystemWatcher 中排除临时文件

Powershell:从 FileSystemWatcher 中排除临时文件

当在目录中创建或更改 docx 文件时,我使用$watcher( FileSystemWatcher) 来触发:$action

$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\ExportedDocuments"
$watcher.Filter = "*.docx*"
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true  
$action = [scriptblock]::Create('
### here is my complete script
')
Register-ObjectEvent $watcher "Created" -Action $action
Register-ObjectEvent $watcher "Changed" -Action $action
while ($true) {}

$watcher不幸的是,在( FileSystemWatcher) 查看的目录中,有时会创建临时文件:

2019 年 1 月 23 日 07:53:52,已创建,C:\ExportedDocuments\~$FFFFFFFF.docx

这意味着临时文件也会被$watcherFileSystemWatcher)检测到并强制$action运行。

有没有办法可以从中排除这些临时文件$watcher

答案1

根据文档你不能有多个过滤器:

使用多个过滤器,例如“.txt|不支持“.doc”。

但是你可以将过滤器放在你的 $action 中。例如:

$action = { $fileName = Split-Path $Event.SourceEventArgs.FullPath -leaf

            if ($fileName -like '~$*') { $logline = "$(Get-Date), $fileName, 'TEMP'"}
            else { $logline = "$(Get-Date), $fileName, 'NOT TEMP'" }

            Add-content "D:\test\log.txt" -value $logline
          }

产生如下输出:

01/23/2019 11:37:37, ~$f.docx, 'TEMP'
01/23/2019 11:37:37, ~$f.docx, 'TEMP'
01/23/2019 11:38:29, New Microsoft Word Document.docx, 'NOT TEMP'

因此,要简单地根据'〜$'模式排除临时文件,您可以使$action如下:

$action = { $fileName = Split-Path $Event.SourceEventArgs.FullPath -leaf
            if (-not ($fileName -like '~$*')) {
              # Do whatever
            }
          }

答案2

不幸的是,不行。您的处理程序必须确定哪个文件是临时文件并忽略它。对于 MSWord 临时文件:名称以波浪符号 (~) 开头和/或隐藏属性

相关内容