1

PowerShell プロジェクトをモジュールに分割しています。しかし、それらはモジュールであるため、変更するたびにリロードする必要があります。そこで、FileSystemWatcher を持つループを作成し、.psm1 ファイルの 1 つが変更された場合、そのモジュールをリロードまたはインポートします。

問題は、上記のループでは作業環境で他のスクリプトを実行できないため、新しい環境では同じモジュールがロード/リロードされないことです。これらのモジュールをプライマリの既定の PowerShell モジュール フォルダーから除外する必要があります。モジュールが同じ環境で変更されたとき、または特定の環境に影響を与えたときにモジュールをリロードするスクリプトを実行する方法はありますか?


アップデート

そこで、次の Module-Loader.ps1 スクリプトを実行します。「FileChanged」イベントに関連付けられたコード ブロックは、変更後に *.psm1 ファイルを「保存」すると発生します。ただし、2 つの問題が発生します。1) 保存すると 2 回起動します。

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

これはセッションで実行されていますが、イベントのコード ブロックはこの特定の環境に関連付けられていないと私は考えています。

4

1 に答える 1

2

これは、何かが変更されたときにフォルダーを共有フォルダーにコピーするコードの例です。それはちょっと私の小さなドロップボックスの実装です:-)

などのファイル システム ウォッチャー イベント タイプのいずれかが発生すると、コマンドレットのパラメーターでChanged指定されたコードが起動します。-ActionRegister-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 }
于 2011-12-23T17:24:51.280 に答える