まず、私は同様の質問hereを持っていますが、問題解決の方向性はありませんでした。投稿者のアイデアでAndy Arismendi私は可能な解決策を思いつき、これは新しい問題です:現在の作業環境でモジュールをリロードするためにFileSystemWatcherイベントが必要
以下のコードブロックをFileChangedイベントにバインドする以下のスクリプトを実行しています。 .psm1モジュールファイルが変更されると、コードブロックはファイルがロードされているかどうかをチェックし、リロードを試みます。そうでなければ、モジュールをインポートします。しかし、私は、何らかの形でイベントがイベントをバインドしているインラインスクリプトが実行されている現在の実行環境に関連付けられていないと考えています。それが実行されるにもかかわらず) 1).psm1ファイルは、ファイルの保存1のために(2回イベントを実行変更)
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
}
}
問題:私は、コードの下にある2つの問題がリストされていますreload/importコマンドは、ロードされていない別の環境で動作している必要があります。しかし、すべての出力は、スクリプトがイベントをバインドしている現在の実行環境に移動します。
私が言及したように、私は、コードブロックが現在のセッションに何らかの形で関連付けられていないと確信しています。
申し訳ありませんが、私はあなたのコードを試してみる機会がなかったです。どこかに "Reload-Module"という名前の関数がありますか?理由は、それがコマンドレットではないからです。そのための関数が定義されていない場合は、 'remove-module'を' import-module'と '-force'フラグをつけて' import-module'と組み合わせる必要があります。 –
@Andy - 私はそれを試しましたが、それ以上はありません。私は次のことを見つけましたが、回避する方法がわかりませんでした:http://blogs.msdn.com/b/powershell/archive/2008/06/11/powershell-eventing-quickstart.aspx ... Register- * Eventコマンドレットは-Actionスクリプトブロックをサポートします。イベントが到着したら、PowerShellはそのスクリプトブロックをバックグラウンドで呼び出します。これらのアクションは、独自のモジュールで呼び出されます。$ GLOBAL変数を取得および設定できますが、通常の変数の変更は、それぞれの独立した環境で行われます。 – pghtech