是否有理由显式导入模块?

Is there ever a reason to explicitly Import-Module?

我刚刚阅读了 PowerShell Modules 指南页面,我注意到 Import-Module 部分有一行:

The following actions trigger automatic importing of a module, also known as "module auto-loading."

  • Using a cmdlet in a command. For example, typing Get-ExecutionPolicy imports the Microsoft.PowerShell.Security module that contains the Get-ExecutionPolicy cmdlet.

既然如此,我们为什么还要关心使用 Import-Module?它不是一直自动照顾我们吗?在什么情况下我需要明确写出 Import-Module?

以下情况必须使用Import-Module:

  • 模块文件不在 $PSModule 路径
  • 中包含的路径中
  • 您有不同的同名模块,但路径不同
  • 模块已经加载,修改后重新加载。 (带 -Force)
  • 仅从该模块导入特定的 cmdlet、函数或变量(分别使用 -Cmdlet-Function-Variable 参数)
  • 防止从模块加载 cmdlet 或函数会覆盖具有相同名称且已加载到当前会话中的命令(使用 -NoClobber
  • 为本模块中的 cmdlet 的名词添加前缀(with -Prefix
  • 从远程计算机导入模块(使用 -PSSession 参数)

该列表并不完全详尽,但这些是 Import-Module cmdlet 的主要用例。

我知道已经有一个可接受的答案,但我想补充两分钱。

  • 明确记录脚本对模块的依赖性
  • 如果 $PSModuleAutoloadingPreference 设置为 "none",则需要显式加载模块。您不知道用户是否关闭了此功能。