まず、ここに同様の質問がありますが、問題を解決する方向性がありませんでした。ポスターのAndy Arismendiからのアイデアで、可能な解決策を思いつきました。これは新しい問題です。
以下のコード ブロックを FileChanged イベントにバインドする以下のスクリプトを実行しています。.psm1 モジュール ファイルが変更されると、コード ブロックはファイルが読み込まれているかどうかを確認し、再読み込みを試みます。そうでない場合は、モジュールをインポートします。ただし、イベントは、イベントをバインドする初期スクリプトが実行されている現在実行中の環境に何らかの形で関連付けられていないと私は考えています。コードの下に 2 つの問題をリストしました。
# 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 回の保存に対して)。
2) reload/import コマンドを実行しますが、ロードされないため、別の環境で動作している必要があります。ただし、すべての出力は、スクリプトがイベントをバインドした現在実行中の環境に送られます。
前述したように、何らかの形でコード ブロックが現在のセッションに関連付けられていないと確信しています。