Powershell如何自动加载模块?

anauzrmj  于 2023-03-02  发布在  Shell
关注(0)|答案(1)|浏览(202)

我们知道Powershell在3.0中引入了模块自动加载:
... PowerShell会在您首次在已安装模块中运行任何命令时自动导入模块。现在,您可以在模块中使用命令,而无需进行任何设置或配置文件配置...
这是通过PSModulePath实现的。
文档没有解释的是Powershell如何在没有首先加载模块的情况下检测模块中有哪些命令。
也就是说,当使用Import-Module时,我“知道”Powershell将执行(??!)我的.psm1文件中的powershell代码,导出所有函数,...或者我用Export-Modulemember指定的任何函数。
但是,自动加载功能必须事先知道某个命令可通过某个模块使用,而实际上没有加载该模块。
由于我们在PsModulePath中有一些行为不当的第三方模块,并且我们自己编写的模块很少,我们希望锚在PSModulePath中,因此我非常希望了解如何处理PSModulePath中的文件。

n3schb8v

n3schb8v1#

这只是部分答案。
这是通过Get-Command完成/实现的,这 * 似乎 * 能够"解析"模块文件,而无需实际执行PoSh代码。见下文。
来自powershell文档:

隐式导入模块

...适用于包含在PSModulePath环境变量值中的目录中的任何模块...
为了支持模块的自动导入,Get-Command cmdlet获取所有已安装模块中的所有cmdlet和函数,即使模块没有导入到会话中。
然后:

Get-Command

Get-Command cmdlet获取计算机上安装的所有命令...
Get-Command使用命令的确切名称,而不使用通配符,它会自动导入包含该命令的模块,以便您可以立即使用该命令。...
Get-Command直接从命令代码获取数据,与...
文档没有解释"如何"实现这一点,但你可以在源代码中查找它是如何实现的(尽管浏览了一段时间的源代码,但我到目前为止还没有找到它)。
顺便说一句,我找到了mentioned that Powershell 3 was the first version to expose the AST,所以这段时髦的代码完全可以做到这一点:* * 解析脚本并以某种方式检查其AST,以确定是否提供了该命令。**

相关问题