当在目录中创建或更改 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
这意味着临时文件也会被$watcher
(FileSystemWatcher
)检测到并强制$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 临时文件:名称以波浪符号 (~) 开头和/或隐藏属性