Требуется событие FileSystemWatcher для перезагрузки модулей в текущей рабочей среде - PullRequest
1 голос
/ 29 декабря 2011

Во-первых, у меня есть похожий вопрос здесь , но у меня не было направления по решению проблемы.С идеей от автора Энди Арисменди Я придумаю возможное решение, и это новая проблема:

Я запускаю приведенный ниже скрипт, который связывает приведенный ниже блок кода с событием FileChanged,Когда файл модуля .psm1 изменяется, блок кода проверяет, загружен ли файл, и пытается перезагрузить его.Если нет, он импортирует модуль.Однако я придерживаюсь мнения, что событие каким-то образом не связано с текущей рабочей средой, в которой выполняется начальный сценарий, который связывает событие.Я перечислил две проблемы ниже кода:

# create a FileSystemWatcher on the currect directory
$filter = '*.psm1'
$folder = $PWD
$watcher = New-object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $false; EnableRaisingEvents = $true; NotifyFilter = [IO.NotifyFilters]'LastWrite'}
Register-ObjectEvent $watcher Changed -SourceIdentifier FileChanged -Action { 
    $folder = $PWD
    $name = $Event.SourceEventArgs.Name 
    $filename = $name.Remove($name.IndexOf('.'), 5)

    Write-Host $PWD

    $loadedModule = Get-Module | ? { $_.Name -eq $filename }
    write-host $filename

    if ($loadedModule) {
        write-host "Reloading Module $folder\$($filename)"
        Reload-Module $filename
    } else {
        write-host "Importing Module $folder\$($filename)"
        Import-Module .\$filename
    }
}

Проблемы: 1) При изменении файла .psm1 событие запускается дважды (для одного сохранения файла)

2) Дажехотя он выполняет команды перезагрузки / импорта, он должен работать в другой среде, поскольку они никогда не загружаются.Но все выходные данные отправляются в текущую рабочую среду, в которой сценарий связывает событие.

Как я уже говорил, я убежден, что каким-то образом блок кода не связан с текущим сеансом.

1 Ответ

0 голосов
/ 30 декабря 2011

Вот как я загружаю модули:

Get-Module -listavailable| foreach{Import-Module $_.name}
...