【问题标题】:Powershell and System.IO.FileSystemWatcherPowershell 和 System.IO.FileSystemWatcher
【发布时间】:2015-08-03 20:11:51
【问题描述】:

我是 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 ??

【问题讨论】:

    标签: powershell filesystemwatcher


    【解决方案1】:
    Unregister-Event $created.Id
    

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

    请注意,如果队列中有事件,它们仍然会被触发。

    This 也可能有帮助。

    【讨论】:

    • 太好了,这似乎可以正常工作并且只能正确识别一个文件。但是,我的脚本仍在运行,我需要脚本停止运行/完成并发送成功消息,以便 SQL 代理中的下一步可以开始。有任何想法吗?谢谢
    • 您可以在操作中设置一些 $flag 为 $true 并将 while 更改为 while (-not $flag) {sleep 1} 或者您可以在操作中添加一些类似 $temp = New-Event -SourceIdentifier "Found-File" -MessageData $path 的东西而不是 while 做 $result = Wait-Event -SourceIdentifier "Found-File"
    【解决方案2】:

    作为订阅事件的操作运行的脚本块可以访问 $Args、$Event、$EventArgs 和 $EventSubscriber automatic variables

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

    ### 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 属性的方式。

    【讨论】:

      【解决方案3】:

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

      Get-EventSubscriber|Unregister-Event
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        • 2012-02-25
        • 2021-05-31
        • 2015-06-11
        • 2020-07-17
        • 2013-12-24
        相关资源
        最近更新 更多