У меня есть часть powershell, который запускает фоновое задание, которое содержит средство отслеживания файлов - основной скрипт продолжает запускать exe и ждать его завершения. Пока исполняемый файл работает, если он касается просматриваемого файла, фоновое задание оживает и выполняет некоторую другую обработку этого файла, затем продолжает ожидание. Когда сценарий заканчивается, он останавливается и удаляет фоновое задание. Меня беспокоит, будет ли это правильно очищать средство просмотра файлов? Есть ли способ, которым родительский сценарий может вызвать событие, которое ожидает фоновое задание, и запустить его?

Я пробовал это - родительский скрипт:

    start-job -name "start-esinput-watcher" -FilePath ".\input-watcher.ps1"

    $process= "notepad.exe"

    Start-Process -filepath $process -Wait 

    #Create the new event again so it gets caught by the subscription
    New-Event -SourceIdentifier StartES.Stopping -Sender PowerShell.StartES -MessageData "stop" #| Out-Null

Сценарий наблюдателя:

    try {
        $watcher = New-Object System.IO.FileSystemWatcher
        $watcher.Path = "d:\temp\"
        $watcher.Filter = "somefile.txt"
        $watcher.IncludeSubdirectories = $false
        $watcher.EnableRaisingEvents = $true

        $action = { 
            Add-Content d:\temp\input-watcher.log "$([DateTime]::Now.ToString()) es_input.cfg file change detected"
        }     

    }
    catch {
        Add-Content d:\temp\input-watcher.log "$([DateTime]::Now.ToString()) Error $($_.Exception.Message)"
    }

    Register-ObjectEvent $watcher Changed -Action $action -SourceIdentifier "ESINPUTCFG_WATCHER"

    while ($true) { 

        $lastEv = get-event | where { $_.SourceIdentifier -eq "StartES.Stopping" } | Select -Last 1

        if ($lastEv -eq $null) {
            Start-Sleep 1 
        }
        else {
            break
        }
    }

    Add-Content d:\temp\input-watcher.log "$([DateTime]::Now.ToString()) Unregistering events and watcher"

    Unregister-Event -SourceIdentifier "ESINPUTCFG_WATCHER"
    $watcher.Dispose()

    Add-Content d:\temp\input-watcher.log "$([DateTime]::Now.ToString()) Fin"

Сценарий никогда не заканчивается, регистрируя что-либо после цикла while. У меня был (в сценарии наблюдателя) объект Register-EngineEvent с действием для установки глобальной переменной равной $ Global:shouldRun = $ false, и я использовал это для цикла while, но это также, похоже, ничего не делало. Что мне не хватает?

0