为什么在 PowerShell 中,当尝试调用模块中的 cmdlet 时,会自动导入已安装的模块?

Lit*_*ain 2 powershell powershell-7.3

我是 PowerShell 的新手。我在导入模块时遇到了问题。当我尝试在该模块中调用 cmdlet 时,似乎会自动导入已安装的模块。

那是:

  1. 如果已经安装了某个模块,例如Install-Module -Name PSscriptAnalyzer
  2. 不要导入它。检查是否已导入:
    Get-Module PSScriptAnalyzer
    # Show nothing
    
    Run Code Online (Sandbox Code Playgroud)
  3. 尝试在以下位置使用 cmdlet PSScriptAnalyzer
    Invoke-ScriptAnalyzer -Path ./ -Recurse
    # Ignore any info
    
    Run Code Online (Sandbox Code Playgroud)
  4. 然后模块PSScriptAnalyzer将自动导入:
    Get-Module PSScriptAnalyzer
    
    Run Code Online (Sandbox Code Playgroud) 显示如下:
    ModuleType Version    PreRelease Name                                
    ExportedCommands
    ---------- -------    ---------- ----                                ----------------
    Script     1.21.0                PSScriptAnalyzer                    {Get-ScriptAnalyzerRule, Invoke-Formatter, Invoke-ScriptAnalyzer}
    
    Run Code Online (Sandbox Code Playgroud)

为什么模块只要导入了就会自动导入呢ExportedCommands?它的机制是什么?如果是这样,那么Remove-Module在一般使用场景中似乎就没有多大意义了。

提前致谢。

San*_*zon 7

此功能称为模块自动加载,在 PowerShell 3.0 中引入:

当您第一次在已安装的模块中运行任何命令时,PowerShell 会自动导入模块。现在,您可以使用模块中的命令,而无需进行任何设置或配置文件配置,因此在将模块安装到计算机上后无需管理它们。


如果是这样,那么Remove-Module在一般使用场景中似乎就没有多大意义了。

确实,cmdlet 很少使用,但Remove-Module仍然有其用途,主要用于模块开发。当您需要测试对模块的更改而不需要重新启动会话时,cmdlet 仍然可行(这只适用于非二进制模块,对于二进制模块,您必须重新启动会话,程序集无法卸载)。Import-Module -Force也适用于相同的用例。

另一个用例(也是罕见的)是具有自定义OnRemove回调的模块。请参阅使用 OnRemove 事件