У меня есть часть 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, но это также, похоже, ничего не делало. Что мне не хватает?