Powershell FileSystemWatcher网络驱动器停止工作。需要重置吗?

时间:2016-03-04 08:47:20

标签: powershell filesystemwatcher network-drive

我在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将无法再检测到新文件

0 个答案:

没有答案