Q: Как использовать Start-Job
в блоке действий Register-ObjectEvent для распараллеливания и запуска нескольких блоков сценариев?
Рабочий код
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\temp"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true
$action = {
$path = $Event.SourceEventArgs.FullPath
write-host "$(Get-Date), START LOCK, $path"
$file = [System.io.File]::Open($path, 'Open', 'Read', 'None')
sleep -milliseconds 10000
$file.close()
}
Register-ObjectEvent $watcher "Created" -Action $action | Out-null
while ($true) {sleep -milliseconds 1000}
Что делает этот код
- Мониторинг определенной папки (c: \ temp в моем примере) для вновь созданных файлов
- Если файл создан, заблокируйте его исключительно
- Подождите 10 секунд
- Снять блокировку файла
Чего я пытаюсь достичь
Приведенный выше код хорошо работает для случая, когда создается только 1 файл в течение 10 секунд. Но как только создается больше файлов, скрипт завершается ошибкой из-за блокирования 10s sleep
Теперь я подумал, что мог бы использовать Start-Job
, поэтому каждый новый файл порождает отдельную работу (задачу), которая затем блокирует файл и ждет 10 секунд.
Следующий код - моя лучшая попытка, но я не знаю, что я делаю неправильно
Не работает код
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\temp"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true
$action = {
$path = $Event.SourceEventArgs.FullPath
write-host "$(Get-Date), START LOCK, $path"
Start-Job -ArgumentList $path –Scriptblock {
param ($path)
$file = [System.io.File]::Open($path, 'Open', 'Read', 'None')
sleep -Milliseconds 20000
$file.close()
}
}
Register-ObjectEvent $watcher "Created" -Action $action | Out-null
while ($true) {sleep -milliseconds 1000}