2015-11-27 3 views
0

У меня есть код ниже, чтобы обнаружить создание нового файла и захватить его копию.Копировать файл при создании (после завершения)

$folder = '\\server\share\monitor_me\' 
$filter = '*.*' 
$copyToFolder = 'C:\temp\capture\' 

$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $true;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'} 

#protection from previous runs 
unregister-event -SourceIdentifier FileCreated -ErrorAction SilentlyContinue 

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 
    Copy-Item -Path $Event.SourceEventArgs.FullPath -Destination $copyToFolder 
} 

Тестирование его с этим кодом в параллельной сессии:

1..1000 ` 
| %{new-object -TypeName pscustomobject -Property @{Id=$_;Name="hi"} } ` 
| export-csv '\\server\share\monitor_me\test.csv' 

... показывает, что код делает работу; но захватывает файл в момент его появления, а не ждет, когда он будет полностью заполнен, поэтому я получаю только часть полученного файла.

Я могу добавить заявление start-sleep; но это приведет к условиям гонки.

Я предполагаю, что есть блокировка файла, пока он записывается (т.е. предотвращает обновление других процессов от одного и того же файла, но не влияет на чтение/копирование файла), поэтому в идеале хотелось бы иметь какой-то способ подождать пока этот замок не будет удален.

  • Является ли мое предположение о наличии блокировки файла для процесса export-csv правильно?
  • Есть ли способ обнаружить, когда замок заблокирован?

Заранее спасибо

ответ

1

Устранены путем изменений контролируемого события ИЗМЕНИТЬ. Кажется, 2 изменения происходят после первоначального создания. Для простоты я просто наблюдаю за любым событием изменения (таким образом, у меня всегда будет последняя копия) и включите параметр -Force, чтобы можно было перезаписать файл назначения.

Register-ObjectEvent $fsw Changed -SourceIdentifier FileUpdated -Action { 
    $name = $Event.SourceEventArgs.Name 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $timeStamp = $Event.TimeGenerated 
    Write-Host "The file '$name' was $changeType at $timeStamp" -fore green 
    Copy-Item -Path $Event.SourceEventArgs.FullPath -Destination $copyToFolder -Force 
} 

NB: Я не уверен на 100%, будет ли это теперь захватывать все новые файлы; так как потенциально есть способ создать файл без запуска события изменения (т. е. я не нашел никакой документации, чтобы сказать, что этот сценарий не существует); но кажется достаточно хорошим для моих текущих целей.

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

  • Нет связанных вопросов^_^