2011-12-23 2 views
1

내 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 
} 
} 

세션에서 실행 중이지만 이벤트의 코드 블록이이 특정 환경과 관련되지 않는다고 생각합니다.

+0

나는 당신의 질문을 이해하지 못합니다. 루프가 되었기 때문에 다른 코드가 실행되는 것을 차단하고 있습니까? 그렇다면 루프를 사용하는 대신 이벤트 처리기를 등록하여 파일 시스템 감시자가 스크립트 블록을 비동기 적으로 시작하도록 할 수 있습니다. 그게 당신이 필요로하는 것처럼 들리면 나는 그것의 예제 코드를 줄 수 있습니다. –

+0

@Andy : 예, 루프에 있기 때문에 다른 코드를 차단합니다. 모듈을 다시로드/가져 오는 것은 파일 시스템 감시 프로그램이 실행되는 현재 환경에만 있기 때문에 다시로드되거나 가져온 모듈에 종속 된 스크립트는 다시 실행할 수 없습니다. 나는 행사가 끝날 때까지 시계를 끄는 것이 효과가 있을지 확신하지 못한다. 하지만, 그렇지 않다면 몇 가지 예를 게시 할 수 있습니까? – pghtech

답변

2

다음은 코드가 변경되었을 때 공유 폴더에 폴더를 복사하는 예제입니다. 그것은 좀

때마다 같은 Changed가 발생하는 파일 시스템 감시자 이벤트 유형 중 하나 :-) 내 작은 보관 용 구현, 화재 것이다 Register-ObjectEvent cmdlet의 -Action 매개 변수에 지정된 코드입니다.

-Action 코드에서 -Force 매개 변수를 사용하여 Import-Module을 호출하면 메모리에 현재 값을 덮어 쓸 수 있습니다.

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 } 
+0

나는 당신의 제안을 받아이 같은 경로를 갔다. 그리고 나의 행동은 기본적으로 모듈이로드되고 변경된 모듈 (.psm1) 파일을 가져 오거나 다시로드하는지 확인한다. 그러나 코드 블록을 실행하면 반환되는 것은 무엇이든간에 모듈을로드하지 않습니다. 적어도 환경에서 코드 블록을 이벤트에 바인딩하는 스크립트를 실행했습니다. – pghtech

+0

코드 블록에 환경 특정 정보를 전달하고 특정 세션/환경에 대해 모듈을로드하는 방법이 있는지 확인하려고했습니다. – pghtech

+0

다음과 같이 올바르게 말하면 이해할 수 있습니다. 1. Import-Module은 초기 모듈을로드합니다. 2. 모듈 파일이 변경됩니다. 3. 이벤트 핸들러가 스크립트 블록을 시작합니다. 4. 스크립트 블록이 모듈을 다시로드합니다. 5. 모듈 변경 사항이 적용되지 않습니다. 그게 맞습니까? –

관련 문제