虽然显式加载您想要使用的模块是一个很好的做法Import-Module
,自 Powershell 3.0 起,如果模块在由返回的位置之一可用$env:PSModulePath
,如果调用其中一个 cmdlet,它将默认自动加载。以下是不同路径的细分:
用户模块
$modulePath = "${env:UserProfile}\Documents\WindowsPowerShell\Modules"
此处安装的模块仅适用于当前用户的 Powershell 会话,并且默认情况下使用安装的模块Install-Module
都保存在这里。
所有用户模块
$modulePath = "${env:ProgramFiles}\WindowsPowerShell\Modules"
此处安装的模块可供任何用户的 Powershell 会话使用。
系统模块
$modulePath = "${env:SystemRoot}\system32\WindowsPowerShell\v1.0\Modules"
此处安装的模块可在系统范围内供任何 Powershell 会话使用,但应保持干净以便 Windows 管理。通常,您不想在这里安装自己的模块。
添加附加模块路径
您可以添加其他路径$env:PSModulePath
与您修改的方式类似$env:PATH
用于解析可执行路径的变量。它只是一个分号;
模块所在目录的分隔字符串,以及模块是否在任何路径中可用$env:PSModulePath
,Powershell就会知道在哪里可以找到它。事实上,您可能会看到其他已安装的工具可能已将自己的路径添加到$env:PSModulePath
。执行此操作的程序/工具集的一些示例是Microsoft SQL Studio
, Microsoft System Center - Operations Manager
,以及Chef Development Kit
.
导入不在路径上的模块
据我所知,您无法加载不属于的Powershell模块$env:PSModulePath
。不过,您可以暂时编辑$env:PSModulePath
包含包含要加载的模块的目录。例如,如果您想导入名为的模块TestModule
从某个任意路径:
$env:PSModulePath += ';C:\Path\To\Temporary\ModuleDirectory'
Import-Module TestModule
where TestModule
作为子文件夹存在C:\Path\To\Temporary\ModuleDirectory
当您准备结束 Powershell 会话时,无需取消模块路径更改,因为上述更改是临时的。因此,您需要修改$env:PSModulePath
在每个会话中,所以如果TestModule
是您希望随时可用的东西,您可以将其复制到以下目录中的其他目录之一$env:PSModulePath
或永久添加C:\Path\To\Temporary\ModuleDirectory
to the PSModulePath
环境变量。
关于 UNC 路径的注意事项
您还可以将 UNC(网络)路径添加到$env:PSModulePath
。但是,我相信任何远程模块脚本仍将受到 Powershell 的约束ExecutionPolicy
系统上设置。
关于安装模块的更多信息
默认情况下,Install-Module
安装一个模块到用户模块目录,但你可以用-Scope
范围。例如,以下命令将更改模块的安装位置:
# Install to the current user location (default behavior if scope unspecified)
Install-Module -Scope CurrentUser $moduleName
# Install to the all users location (requires elevated permissions)
Install-Module -Scope AllUsers $moduleName
不幸的是,这是 PowerShell 唯一可以帮助您安装模块的两个位置。系统模块对于 PowerShell 的操作至关重要,最终用户不应修改,并且将其他路径添加到$env:PSModulePath
可能由 PowerShell 外部的软件管理,通常由 MSI 或其他安装程序管理。
此外,如果您编写的软件附带一个或多个 PowerShell 模块,最好让安装程序向系统的目录中添加一个新目录。%PSModulePath%
并将模块放到那里,而不是安装到标准的 AllUsers 或 CurrentUser 路径,因为这些路径实际上是供最终用户随意管理的。在这种情况下,请让您的软件更新过程更新模块。这样做的好处是可以防止意外修改模块或将模块删除为不兼容的版本。