3

我开始学习 Powershell 并正在编写一个模块 (psm1) 来存储我的函数。然后我在模块中插入了这段代码,以便在修改模块时重新加载模块:

function reload
{
    Remove-Module init
    Import-Module F:\Script\init.psm1
}

这个函数的结果对我来说有点奇怪:

PS F:\Script> Get-Module

ModuleType Name                                ExportedCommands
---------- ----                                ----------------
Script     init                                {cpu, ie, lol, outlook...}
Manifest   Microsoft.PowerShell.Management     {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content...}
Manifest   Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object...}


PS F:\Script> reload
PS F:\Script> Get-Module

ModuleType Name                                ExportedCommands
---------- ----                                ----------------
Manifest   Microsoft.PowerShell.Management     {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content...}
Manifest   Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object...}


PS F:\Script>

为什么函数中的第二个命令没有效果?我还注意到,如果我在函数末尾插入“Get-Module”,模块就会出现在列表中,就像模块在其他 Powershell 实例/会话中“运行”一样。如果是这样,有没有办法使效果持久?

谢谢!

编辑:

我通过在导入函数中添加一个参数来临时解决,以指定加载模块的范围:

Import-Module F:\Script\init.psm1 -Global

这是处理范围的正确方法吗?

4

2 回答 2

2

也许这是因为模块中的函数是在模块范围内执行的。

此处红色箭头下方显示范围解析序列。

F1 函数调用 F2 函数和 F2 函数调用模块内部的函数。函数 F1 和 F2 将它们的变量放在默认范围内。函数 FMOD 使用模块范围。

这可以解释为什么 Get-Module 在函数内部调用时会显示 Ini。

在此处输入图像描述

于 2013-06-14T15:52:18.227 回答
0

与其添加重新加载功能,不如使用-Force您最初使用的参数Import-Module。这将强制重新导入模块,获取自上次导入以来您对其所做的任何更改。

于 2014-01-26T18:57:07.153 回答