如何在脚本中使用PowerShell模块而不会在用户会话中加载模块?

时间:2013-09-30 23:23:07

标签: powershell powershell-v3.0

我希望在PowerShell提示符下以交互方式使用脚本。该脚本需要使用本地脚本模块。

我无法看到如何导入/使用模块,使其在当前会话中不会被加载。

示例

模块(MyModule.psm1)......

function Test-Method
{
    write-host "Test-Method invoked"
}

...和脚本(script.ps1)

Import-Module .\MyModule
Test-Method

现在在PowerShell提示符下运行脚本......

PS C:\temp> Get-Module | % {$_.Name}
Microsoft.PowerShell.Management
Microsoft.PowerShell.Utility

PS C:\temp> .\script.ps1
Test-Method invoked

PS C:\temp> Get-Module | % {$_.Name}
Microsoft.PowerShell.Management
Microsoft.PowerShell.Utility
MyModule

我的脚本如何导入并使用MyModule.psm1,而不会在调用者的当前会话中加载它?请记住,调用可能已经导入了模块,并且不希望脚本卸载它(因此只需在脚本完成时删除模块就不够了)。

我考虑过点源模块而不是导入模块,但我想了解模块的原因PowerShell Import-Module vs Dot Sourcing

4 个答案:

答案 0 :(得分:6)

听起来你已经用伪代码描述了你想要的东西。这是实际代码:

$checkCmds = Get-Commands -Module MyModule

Import-Module MyModule

# Do stuff here . . .

# unload only if we loaded it
if ($checkCmds -eq $null) { Remove-Module MyModule }

答案 1 :(得分:1)

据我所知,您没有从导入模块的“脚本”中获得自动清理行为。 OTOH如果从另一个模块中导入模块,当删除父模块时,如果没有其他模块使用它们(或除非指定了ipmo -global),它将导入的任何模块都将被删除。

答案 2 :(得分:0)

这是基于previous answer并使用以下属性。

  

如果您从另一个模块中导入一个模块,那么当父模块被删除时,它导入的所有模块都将被删除

您可以利用多种技术来创建包装器:

  • 从模块导入模块
  • 匿名模块
  • 在模块上下文中调用操作符

script.ps1 设置为

& (New-Module {
    function Invoke-Function {
        Import-Module .\MyModule
        Test-Method
    }
}) { Invoke-Function }

如果运行 script.ps1 然后运行(Get-Module).Name,则MyModule将不会出现在输出中。

注意:在此示例中,Invoke-Function只是另一个作用域,可以省略,让New-Module在定义时才运行。一行:

& (New-Module { Import-Module .\MyModule; Test-Method }) {}

答案 3 :(得分:-2)

您可以使用-Scope local导入模块,以将模块限制在脚本范围内。如果模块也恰好在全局范围内加载,那么在脚本退出后它仍然可用。