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

Мой проект PowerShell разбит на модули. Но поскольку они являются модулями, я должен перезагружать их каждый раз, когда меняю их. Поэтому я написал цикл с FileSystemWatcher, и если один из файлов.psm1 изменится, он либо перезагрузит, либо импортирует этот модуль.

Проблема в том, что вышеприведенный цикл не позволит мне запускать другие сценарии в своей рабочей среде, поэтому в новой среде не будут загружаться / перезагружаться те же модули. Мне нужно держать эти модули вне основной папки (модулей) PowerShell по умолчанию. Есть ли способ запустить скрипт, который перезагружает модули, когда они изменяются в той же среде или влияют на определенную среду?


ОБНОВИТЬ

Поэтому я запускаю следующий скрипт Module-Loader.ps1. Блок кода, связанный с событием FileChanged, срабатывает, когда я "сохраняю" файл *.psm1 после его изменения. Однако возникают две проблемы: 1) он срабатывает дважды, когда я сохраняю

2a) Если модуль не загружен, он запустит Import-Module $PWD\ModuleName, но на самом деле он не будет загружен, по крайней мере, в среде (если я выполню тот же код в среде, он загрузится)

2b) если он загружен и пытается удалить модуль, он выдаст ошибку, что его не существует.

# 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 { 
$name = $Event.SourceEventArgs.Name 
$filename = $name.Remove($name.IndexOf('.'), 5)

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

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

Я придерживаюсь мнения, что, хотя это выполняется в сеансе, блок кода в событии не связан с этой конкретной средой.

1 ответ

Вот пример из моего кода, который копирует папку в общую папку каждый раз, когда в ней что-то меняется. Это моя маленькая реализация Dropbox:-)

В любое время один из типов событий наблюдателя файловой системы, таких как Changed происходит, код, указанный в -Action параметр Register-ObjectEvent Командлет будет срабатывать.

В вашем -Action код, который вы бы назвали Import-Module с -Force параметр для перезаписи текущего в памяти.

function Backup-Folder {
    & robocopy.exe "c:\folder" "\\server\share" /MIR /W:10 /R:10
}

$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "c:\folder"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true

Register-ObjectEvent $watcher "Changed" -Action { Backup-Folder }
Register-ObjectEvent $watcher "Created" -Action { Backup-Folder }
Register-ObjectEvent $watcher "Deleted" -Action { Backup-Folder }
Register-ObjectEvent $watcher "Renamed" -Action { Backup-Folder }
Другие вопросы по тегам