【问题标题】:FileWatcher TaskFileWatcher 任务
【发布时间】:2014-03-08 04:59:26
【问题描述】:

目标:创建一个文件观察器以在文件停止写入时执行一些任务(即文件大小停止更改或最后一次写入未发生在 X 时间)

我知道您可以在创建/删除/更改/重命名文件时使用 powershell 创建任务。如果文件 X 时间没有更改(使用 powershell 或其他语言),有没有办法利用它来表示做某事?

    $folder = '<path>' # Enter the root path you want to monitor. 
    $filter = '*.*'  # You can enter a wildcard filter here. 

    # In the following line, you can change 'IncludeSubdirectories to $true if required.                           
    $fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'} 

    # Here, all three events are registerd.  You need only subscribe to events that you need: 

    Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action { 
    $name = $Event.SourceEventArgs.Name 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 
    Write-Host "The file '$name' was $changeType at $timeStamp" -fore green 
    Out-File -FilePath c:\scripts\filechange\outlog.txt -Append -InputObject "The file '$name' was $changeType at $timeStamp"} 

    Register-ObjectEvent $fsw Deleted -SourceIdentifier FileDeleted -Action { 
    $name = $Event.SourceEventArgs.Name 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 
    Write-Host "The file '$name' was $changeType at $timeStamp" -fore red 
    Out-File -FilePath c:\scripts\filechange\outlog.txt -Append -InputObject "The file '$name' was $changeType at $timeStamp"} 

    Register-ObjectEvent $fsw Changed -SourceIdentifier FileChanged -Action { 
    $name = $Event.SourceEventArgs.Name 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 
    Write-Host "The file '$name' was $changeType at $timeStamp" -fore white 
    Out-File -FilePath c:\scripts\filechange\outlog.txt -Append -InputObject "The file '$name' was $changeType at $timeStamp"} 

    # To stop the monitoring, run the following commands: 
    # Unregister-Event FileDeleted 
    # Unregister-Event FileCreated 
    # Unregister-Event FileChanged

【问题讨论】:

    标签: powershell filesystemwatcher


    【解决方案1】:

    我不知道您可以使用哪种事件类型来触发它,但您可以在更改或创建时启动这样的流程:

    while ($true)
     {
       try{ 
            [IO.file]::openwrite(<filepath>).close()
            break
          }
    
       catch { start-sleep -Seconds 5 }
     }
    
     do-stuff
    

    只要文件正在被写入,你就无法获得写锁,openwrite 会抛出错误。一旦它关闭,openwrite 就会成功,打破循环并进入脚本的其余部分。

    【讨论】:

      【解决方案2】:

      当您检查指定时间段内是否没有事件时,等待事件对您没有帮助。您可以检查LastWriteTime 属性以查看文件是否在给定的时间跨度内被更改:

      $threshold = 5  # minutes
      
      $f = Get-Item 'C:\path\to\your.file'
      
      if (((Get-Date) - $f.LastWriteTime).TotalMinutes -lt $threshold) {
        'File has been changed.'
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多