2014-01-30 7 views
0

У меня проблема с IO.FileSystemWatcher. У меня есть сценарий, который при копировании файлов в определенный каталог обрабатывает этот файл и копирует его в другую папку в сети. Но есть проблема, он начинает копировать, как только fsw запускает событие oncreate, которое генерирует ошибку (файл открыт), и я хочу, чтобы он запускался только после завершения копирования файла. Переименовать и удалить работает правильно. cloud.ps1 - это скрипт, который обрабатывает файл и копирует его. Это код сценария монитора:Powershell: выполнить скрипт после завершения копирования файлов

$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)" 
} 

ответ

1

Вы можете поместить в петлю, чтобы начать проверку, чтобы увидеть, если вы можете получить блокировку на запись файла:

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

Пока файл записывается, вы не сможете получить блокировку записи, и Try будет терпеть неудачу. Как только запись будет завершена, и файл будет закрыт, OpenWrite преуспеет, цикл прерывается, и вы можете продолжить копирование файла.

Смежные вопросы