7

我有一个希望从 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

4 回答 4

8

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

$checkCmds = Get-Commands -Module MyModule

Import-Module MyModule

# Do stuff here . . .

# unload only if we loaded it
if ($checkCmds -eq $null) { Remove-Module MyModule }
于 2013-10-02T02:56:35.463 回答
1

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

于 2013-10-01T02:06:49.960 回答
1

这建立在上一个答案的基础上并使用以下属性。

如果您从另一个模块中导入一个模块,当父模块被删除时,它导入的任何模块都将被删除

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

  • 从模块导入模块
  • 匿名模块
  • 调用带有模块上下文的运算符

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 }) {}
于 2018-11-05T22:10:50.670 回答
-1

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

于 2013-10-04T06:23:20.027 回答