내 PowerShell 프로젝트를 모듈로 분해했습니다. 그러나 모듈이므로 모듈을 변경할 때마다 모듈을 다시로드해야합니다. 그래서 FileSystemWatcher가있는 루프를 작성하고 .psm1 파일 중 하나가 변경되면 해당 모듈을 다시로드하거나 가져옵니다.열린 작업 환경에서 다른 작업 환경에 영향을주기 위해 모듈을 다시로드하는 방법
위의 루프는 작업 환경에서 다른 스크립트를 실행할 수 없기 때문에 새로운 환경에 동일한 모듈이로드되거나 다시로드되지 않습니다. 이 모듈을 기본 기본 PowerShell 모듈 폴더 밖으로 유지해야합니다. 동일한 환경에서 변경되거나 특정 환경에 영향을 줄 때 모듈을 다시로드하는 스크립트를 실행할 수 있습니까?
UPDATE 그래서 나는 다음과 같은 모듈 - 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
}
}
세션에서 실행 중이지만 이벤트의 코드 블록이이 특정 환경과 관련되지 않는다고 생각합니다.
나는 당신의 질문을 이해하지 못합니다. 루프가 되었기 때문에 다른 코드가 실행되는 것을 차단하고 있습니까? 그렇다면 루프를 사용하는 대신 이벤트 처리기를 등록하여 파일 시스템 감시자가 스크립트 블록을 비동기 적으로 시작하도록 할 수 있습니다. 그게 당신이 필요로하는 것처럼 들리면 나는 그것의 예제 코드를 줄 수 있습니다. –
@Andy : 예, 루프에 있기 때문에 다른 코드를 차단합니다. 모듈을 다시로드/가져 오는 것은 파일 시스템 감시 프로그램이 실행되는 현재 환경에만 있기 때문에 다시로드되거나 가져온 모듈에 종속 된 스크립트는 다시 실행할 수 없습니다. 나는 행사가 끝날 때까지 시계를 끄는 것이 효과가 있을지 확신하지 못한다. 하지만, 그렇지 않다면 몇 가지 예를 게시 할 수 있습니까? – pghtech