У меня есть код ниже, чтобы обнаружить создание нового файла и захватить его копию.Копировать файл при создании (после завершения)
$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
правильно? - Есть ли способ обнаружить, когда замок заблокирован?
Заранее спасибо