13

我正在通过Octopus Deploy将 PowerShell 模块安装到许多不同的服务器上。出于测试目的,我参考了 Microsoft安装 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)

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

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

4

3 回答 3

13

PowerShell 只能“查看”安装在$env:PSModulePath. 否则,您必须使用完整路径导入模块。

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

  1. 将模块安装到默认的系统范围模块目录 ( C:\Windows\system32\WindowsPowerShell\v1.0\Modules)。
  2. 修改系统环境,使PSModulePath变量已经包含您的自定义模块目录(例如,通过组策略首选项)。

不过,后者只会对修改后启动的 PowerShell 会话生效。

于 2014-01-03T13:30:18.310 回答
2

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

%windir%\system32\WindowsPowerShell\v1.0\profile.ps1
于 2014-01-02T14:51:56.430 回答
1

在采取您在问题中阐明的步骤后(我认为这是一般的方法),我找到了两种方法来让 Powershell 识别新的模块源:

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

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

    我发现这对于在正常和提升的提示中运行都是必要的,以使其工作而无需在每种类型的提示中重新启动。(另见对话@主题:PSModulePath。)

于 2017-03-19T04:12:10.607 回答