【问题标题】:Powershell: Execute a script after file finishes copyingPowershell:文件完成复制后执行脚本
【发布时间】:2014-01-30 13:24:55
【问题描述】:

我遇到了 IO.FileSystemWatcher 的问题。我有一个脚本,当文件复制到某个目录时,它会处理该文件并将其复制到网络上的另一个文件夹。但是有一个问题,一旦 fsw 触发 oncreate 事件,它就会开始复制,这会产生错误(文件已打开),我希望它仅在文件完成复制后才开始。重命名和删除工作正常。 cloud.ps1 是处理文件并复制它的脚本。 这是监控脚本的代码:

$watch = '\\HR-ZAG-SR-0011\ACO\ACO2\99. BOX'
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $watch
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true

$changed = Register-ObjectEvent $watcher "Changed" -Action {
#    Write-Host "Changed: $($eventArgs.ChangeType)"
#    $watch\cloud.ps1 modify "$($eventArgs.FullPath)"
}
$created = Register-ObjectEvent $watcher "Created" -Action {
   Write-Host "Created: $($eventArgs.FullPath)"
   .\cloud.ps1 create "$($eventArgs.FullPath)"
}
$deleted = Register-ObjectEvent $watcher "Deleted" -Action {
   Write-Host "Deleted: $($eventArgs.FullPath)"
   .\cloud.ps1 delete "$($eventArgs.FullPath)"
}
$renamed = Register-ObjectEvent $watcher "Renamed" -Action {
   Write-Host "Renamed: $($eventArgs.OldFullPath) to $($eventArgs.FullPath)"
   .\cloud.ps1 rename "$($eventArgs.OldFullPath)" "$($eventArgs.FullPath)"
}

【问题讨论】:

    标签: powershell file-io filesystemwatcher


    【解决方案1】:

    你可以放入一个循环开始检查你是否可以获得文件的写锁:

    While ($True)
     {
       Try { 
             [IO.File]::OpenWrite($file).Close() 
             Break
           }
       Catch { Start-Sleep -Seconds 1 }
     }
    

    只要正在写入文件,就无法获得写锁,Try 会失败。写入完成并关闭文件后,OpenWrite 将成功,循环将中断,您可以继续复制文件。

    【讨论】:

      猜你喜欢
      • 2023-03-02
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      相关资源
      最近更新 更多