PowerShell脚本命令持久化

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

这是处理作用域的正确方法吗?

2个回答

2
也许这是因为模块中的函数在模块范围内执行的原因。
下面的红色箭头显示了作用域解析顺序。
F1函数调用F2函数,F2函数调用一个模块内部的函数。函数F1和F2在默认作用域中获取它们的变量。函数FMOD使用模块作用域。
这可以解释为什么在函数内部调用Get-Module时会显示Ini。
图片描述请见链接。

谢谢你的图表,非常有用。 那么,我该如何在正确的范围内导入这个模块呢? - brutus8890

0
不要添加重新加载功能,只需在最初使用Import-Module的地方使用-Force参数即可。这将强制重新导入模块,捕获自上次导入以来所做的任何更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接