首先,我在这里有一个类似的问题,但没有解决问题的方向。根据海报Andy Arismendi的想法,我想出了一个可能的解决方案,这是一个新问题:
我正在运行下面的脚本,它将下面的代码块绑定到 FileChanged 事件。当 .psm1 模块文件发生更改时,代码块会检查文件是否已加载并尝试重新加载。如果没有,它会导入模块。但是,我认为事件与绑定事件的初始脚本正在运行的当前运行环境无关。我在代码下面列出了两个问题:
# 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) 即使它运行重新加载/导入命令,它也必须在不同的环境中运行,因为它们永远不会被加载。但是所有输出都会转到脚本绑定事件的当前运行环境。
就像我提到的,我确信代码块与当前会话没有关联。