FileSystemWatcher не запускает события до закрытия PowerShell - PullRequest
1 голос
/ 04 июня 2019

У меня есть скрипт (ниже), который просматривает папку, в которой находится скрипт .ps1. При создании файла он запускает файл .bat для выполнения работы.

Первоначально он запускался и закрывалсянемедленно.Поэтому я добавил '' 'Start-Sleep -s 50' ''

. Он работает, но запускает .bat только при закрытии окна PowerShell.

(поскольку я не знаю,сколько времени пройдет, пока файл не появится в папке, это бесполезно).

В идеале я мог бы сделать с запуском файла .bat, как только будет создан новый файл, который, в свою очередь, затемзакрывает окно PowerShell

$configFilePath = $PSScriptRoot
$filter = '*.*'

$fsw = New-Object IO.FileSystemWatcher $configFilePath, $filter -Property @{IncludeSubdirectories = $true;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}

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
    Out-File -FilePath c:\temp\log\Filelog.txt -Append -InputObject "The file '$name' was $changeType at $timeStamp"
    Set-Location "$PSScriptRoot"
    Start-Process "$PSScriptRoot\PS_Run.bat"
}

Start-Sleep -s 50

1 Ответ

1 голос
/ 04 июня 2019

Вы можете заменить Start-Sleep на:

Wait-Event -SourceIdentifier FileCreated

Затем вам нужно добавить команду выхода к вашему наблюдателю следующим образом:

Start-Process "$PSScriptRoot\PS_Run.bat"
exit
}

Поскольку вы не можете выйти из консоли изFileWatcher, вы можете сделать это вместо:

$configFilePath = $PSScriptRoot
$filter = '*.*'

$fsw = New-Object IO.FileSystemWatcher $configFilePath, $filter -Property @{IncludeSubdirectories = $true;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}

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
    Out-File -FilePath c:\temp\log\Filelog.txt -Append -InputObject "The file '$name' was $changeType at $timeStamp"
    Set-Location "$PSScriptRoot"
    Start-Process "$PSScriptRoot\PS_Run.bat"
}
Wait-Event -SourceIdentifier FileCreated -Timeout 50 # or no of seconds before file shows up.

При запуске в качестве запланированной задачи, он будет запускать файл bat, как только будет создан новый файл, и закроет консоль, когда истечет время ожидания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...