我在PowerShell中有一个FileSystemWatcher程序,只要服务器打开就可以在服务器上运行。程序在服务器启动时启动。每次将新文件添加到正在观看的文件夹(即网络驱动器上)时,FSW都应该运行程序。但由于某种原因,它在一段时间后不执行“行动”程序。重新启动后,程序运行正常,每次新文件到达时运行“操作”。我无法找到一个明确的模式 - 它似乎停止响应,有时是在一天后,其他时间只是一次“解雇”行动计划。
我怀疑这是因为我正在观看网络驱动器上的文件,根据stackoverflow上的其他线程,该文件不可靠,可能需要重置:FileSystemWatcher stops catching events
提供的链接在C#中进行了解释,所以我想知道是否可以在Powershell中编写类似的重置?
这是我想要运行的程序。我正在为fsw尝试捕获,但是从我到目前为止收集的内容来看,如果网络连接中断,则必须通过重置来解决问题。
$ErrorActionPreference = "Stop"
$action = "someprogram.ps1"
function log($string, $color, $logfile)
{
if ($Color -eq $null) {$color = 'white'}
write-host $string -foregroundcolor $color
$string | out-file -Filepath $logfile -append
}
$folder = "somefolder"
$filter = '*.csv'
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property
@{
IncludeSubdirectories = $false
NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}
$onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action
{
$global:FilePath = $Event.SourceEventArgs.FullPath
$time = get-date
log -String "File $FilePath detected at $time" -logfile $logfile
& $action
}
我认为像这样的解决方案比运行C#代码更受欢迎:
while (Test-Path -Path $folder)
{
Start-Sleep -Milliseconds 100 #to reduce cpu load
##FileSystemWatcher code here
}
##Somehow restart file watcher if connection is lost
但是,我不希望脚本每隔一秒钟再次运行。所以我想我可能必须在parralell中运行另一个脚本来检查文件夹路径是否存在,并在断开连接时运行
Unregister-Event -SourceIdentifier FileCreated
然后重新启动脚本。然后,如果与文件夹的连接中断了一毫秒,而我的脚本正在睡眠,会发生什么?在这种情况下,测试路径不会注意到任何内容,并且脚本将失败,因为filewatcher将无法再检测到新文件