Powershell脚本命令持久化

时间:2013-06-14 12:20:22

标签: powershell

我开始研究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函数中添加一个参数来暂时解决,以指定加载模块的范围:

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

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

2 个答案:

答案 0 :(得分:2)

这可能来自于模块中的函数在模块范围内执行的事实。

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

F1函数调用F2函数和F2函数调用函数内部模块。函数F1和F2将其变量置于默认范围内。 FMOD功能使用模块范围。

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

enter image description here

答案 1 :(得分:0)

不要添加重新加载功能,只需使用最初使用-Force的{​​{1}}参数。这将强制重新导入模块,从而获取自上次导入以来对其所做的任何更改。