我将PowerShell项目分解为模块。但因为它们是模块,所以每次更改它们都需要重新加载它们。所以我编写了一个包含FileSystemWatcher的循环,如果其中一个.psm1文件发生更改,它将重新加载或导入该模块。
问题是上面的循环不允许我在其工作环境中运行其他脚本,因此新环境不会为其加载/重新加载相同的模块。我需要将这些模块保留在主要的默认PowerShell模块文件夹之外。有没有办法运行在相同环境中更改模块或影响某个环境时重新加载模块的脚本?
更新
所以我运行以下Module-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 :(得分:2)
以下是我所拥有的一些代码示例,只要文件夹发生变化,就会将文件夹复制到共享文件夹中。这有点像我的小Dropbox实现:-)
每当出现Changed
之一的文件系统观察程序事件类型时,-Action
cmdlet的Register-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 }
参数
存储器中。
{{1}}