为所有用户持久安装PowerShell模块

时间:2014-01-02 14:45:26

标签: powershell module powershell-module

我正在通过Octopus Deploy将PowerShell模块安装到许多不同的服务器上。出于测试目的,我使用了Microsoft installing PowerShell Modules的文档指南。

这工作正常,但正如文档所述,我的更改仅在当前会话中可见。也就是说,如果我要做以下事情:

$modulePath = [Environment]::GetEnvironmentVariable("PSModulePath", [EnvironmentVariableTarget]::Machine)
# More practically, this would be some logic to install only if not present
$modulePath += ";C:\CustomModules"
[Environment]::SetEnvironmentVariable("PSModulePath", $modulePath, [EnvironmentVariableTarget]::Machine)

在触手服务器上自动运行此安装程序时,未来的PowerShell会话似乎看不到新安装的模块。

如何以与配置文件无关的方式安装PowerShell模块,以便启动的每个PowerShell会话都能看到它?

3 个答案:

答案 0 :(得分:11)

PowerShell只能“看到”安装在$env:PSModulePath中列出的某个目录中的模块。否则,您必须以完整路径导入模块。

要使所有用户都可以看到新模块,您基本上有两个选择:

  1. 将模块安装到默认的系统范围模块目录(C:\Windows\system32\WindowsPowerShell\v1.0\Modules)。
  2. 修改系统环境,以便PSModulePath变量已包含您的自定义模块目录(例如,通过group policy preference)。
  3. 后者仅对修改后启动的PowerShell会话生效。

答案 1 :(得分:2)

此配置文件适用于所有用户和所有shell。

%windir%\system32\WindowsPowerShell\v1.0\profile.ps1

答案 2 :(得分:0)

在你提出问题(我认为这是一般的方法)之后的步骤之后,我找到了两种方法来获得Powershell认可的新模块源:

  • 重启机器。 (每次都有效。)
  • 重置每个开放会话中的PSModulePath

    $env:PSModulePath=[Environment]::GetEnvironmentVariable("PSModulePath", "Machine")
    

    我发现必须在正常和提升的提示下运行才能使其工作,而无需在每种类型的提示中重新启动。 (另请参阅对话@ Topic: PSModulePath。)