Powershell和System.IO.FileSystemWatcher

时间:2015-08-03 20:11:52

标签: powershell filesystemwatcher

我是PowerShell的新手,我正在尝试使用System.IO.FileSystemWatcher来监视指定文件夹中是否存在文件。但是,一旦检测到文件,我想立即停止监视此文件夹并停止FileSystemWatcher。计划是将PowerShell脚本合并到SQL代理中,以使用户能够还原自己的数据库。基本上我需要知道一旦找到一个文件就停止监视FileSystemWatcher的命令。到目前为止这是脚本。

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
    $watcher = New-Object System.IO.FileSystemWatcher
    $watcher.Path = "C:\TriggerBatch"
    $watcher.Filter = "*.*"
    $watcher.IncludeSubdirectories = $true
    $watcher.EnableRaisingEvents = $true  

### DEFINE ACTIONS AFTER A EVENT IS DETECTED
    $action = { $path = $Event.SourceEventArgs.FullPath
                $changeType = $Event.SourceEventArgs.ChangeType
                $logline = "$(Get-Date), $changeType, $path"
                Add-content "C:\log2.txt" -value $logline              
              }    

### DECIDE WHICH EVENTS SHOULD BE WATCHED + SET CHECK FREQUENCY  
    $created = Register-ObjectEvent $watcher Created -Action $action

while ($true) {sleep 1} 

## Unregister-Event Created ??
##Stop-ScheduledTask ??

3 个答案:

答案 0 :(得分:1)

Unregister-Event $created.Id

这将取消注册该事件。您可能希望将此添加到$ action。

请注意,如果队列中有事件,他们仍会被解雇。

This也可能会有所帮助。

答案 1 :(得分:1)

作为订阅活动上的操作运行的脚本块可以访问$ Args,$ Event,$ EventArgs和$ EventSubscriber automatic variables

只需将Unregister-Event命令添加到scriptblock的末尾,如下所示:

### DEFINE ACTIONS AFTER A EVENT IS DETECTED
$action = { $path = $Event.SourceEventArgs.FullPath
            $changeType = $Event.SourceEventArgs.ChangeType
            $logline = "$(Get-Date), $changeType, $path"
            Add-content "C:\log2.txt" -value $logline  
            Unregister-Event -SubscriptionId $EventSubscriber.SubscriptionId            
          }    

这是仅执行一次操作然后自行清理的事件的模式。

很难有效地探索这些自动变量,因为它们属于Job的范围,但是您可以通过在绘制代码时将它们分配给全局变量来使用它们。您可能也会对Wait-Debugger和Debug-Runspace感到高兴。在$ EventSubscriber变量的情况下,如果您运行Get-EventSubscriber(已经创建了单个订阅),它将返回您获得的确切对象。这就是我找到SubscriptionId属性的方式。

答案 2 :(得分:0)

如果你想停止/取消注册所有注册的事件,你可以调用

Get-EventSubscriber|Unregister-Event