Как использовать Start-Job в блоке действий Register-ObjectEvent - PullRequest
0 голосов
/ 04 сентября 2018

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}

Что делает этот код

  1. Мониторинг определенной папки (c: \ temp в моем примере) для вновь созданных файлов
  2. Если файл создан, заблокируйте его исключительно
  3. Подождите 10 секунд
  4. Снять блокировку файла

Чего я пытаюсь достичь

Приведенный выше код хорошо работает для случая, когда создается только 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}
...