问题摘要: 当我尝试从 PowerShell 高级函数调用 Import-Module 时,它不会导入新的更改。可能是缓存问题?
目前有效的方法:
- 通过在终端中输入完整命令来导入模块效果很好,但我想自动执行此操作,这样我就不必每次更改新模块时都输入完整路径。
Import-Module -Name 'G:\Development\POSH\dev\modules\JnTestModule\JnTestModule\JnTestModule.psd1' -Force -Verbose
- 将我的高级函数复制到名为 testModule.ps1 的外部文件并直接从模块项目根文件夹执行它也可以很好地工作。
testModule.ps1 中的示例代码
function Import-JnScriptModule
{
<#
.SYNOPSIS
Quickly import my custom PowerShell script module for testing changes.
.EXAMPLE
Import-JnScriptModule
#>
[CmdletBinding()]
[Alias('imp')]
param()
begin {}
process
{
$modulesRootDirectory = "G:\Development\POSH\dev\modules"
Write-Debug "modulesRootDirectory:$modulesRootDirectory"
$currentDirectory = (Get-Location).Path
Write-Debug "currentDirectory:$currentDirectory"
Write-Verbose "Check if we are in the modules dev directory."
if ($currentDirectory.StartsWith("$modulesRootDirectory"))
{
if(!$moduleName)
{
$moduleName = (Get-Item -Path $currentDirectory).BaseName
}
Write-Debug "moduleName:$moduleName"
$manifestFileName = "$moduleName.psd1"
Write-Debug "manifestFileName:$manifestFileName"
$projectDirectory = Join-Path -Path $modulesRootDirectory -ChildPath $moduleName
Write-Debug "projectDirectory:$projectDirectory"
$moduleManifestFullPath = Join-Path -Path $projectDirectory -ChildPath $moduleName -AdditionalChildPath $manifestFileName
Write-Debug "moduleManifestFullPath:$moduleManifestFullPath"
if ((Test-Path -Path $moduleManifestFullPath) -eq $true)
{
Remove-Module -Name "$moduleName" -Force -ErrorAction SilentlyContinue
Import-Module -Name "$moduleManifestFullPath" -Force -Verbose
}
else
{
Write-Verbose "Unable to find module manifest path at '$moduleManifestFullPath'."
}
}
else
{
Write-Warning "Skipped import because not a module folder."
}
}
end {}
}
Import-JnScriptModule
这种方式可行,但随后我需要在每个模块项目文件夹中包含一份 testModule.ps1 副本,并且无法使用别名“imp”来执行它。如果可能的话,我还希望将代码放在一个中心位置。
我想要实现的目标: 将高级功能添加到用于管理模块的自定义脚本模块中,然后使用它在开发中快速导入自定义脚本模块。
我希望能够在模块项目目录中简单地输入别名“imp”,以便快速导入、测试更改和快速迭代。请参阅下面的几个示例。
PS G:\Development\POSH\dev\modules\JnTestModule> imp
PS G:\Development\POSH\dev\modules\JnTestModule2> imp
当我输入“imp”时,它似乎执行了该函数并导入了模块,但最新的更改并未导入。不确定这是否是缓存问题,但在我的函数中,我确保先从会话中删除现有模块,然后再强制进行另一次导入。这不起作用。
有人知道有什么办法可以让它工作吗?
我也愿意接受其他建议或解决方法。谢谢!
您的问题是,从模块导入模块会将这些导入范围限定在该模块内(即,使它们仅在那里可见),而在您的情况下,您希望将模块导入到调用者的范围中(在从模块外部调用时,位于非模块范围域(“会话状态”)中)。[1]
一个简单的解决方法是添加
-Global
到您的Import-Module
调用中 (顾名思义,全局导入模块,即跨所有范围域,这也是从非模块范围域调用时默认发生的情况)。Import-Module
[1] 有关 PowerShell 作用域(“会话状态”)的更多信息,请参阅此答案。