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

15

我正在通过Octopus Deploy安装PowerShell模块到多台不同的服务器上。为了测试目的,我按照Microsoft的安装PowerShell模块文档中的指导进行。

这个方法可以正常工作,但是如文档所述,我的更改只能在当前会话中可见。也就是说,如果我执行以下操作:

$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会话都可以看到它?

3个回答

17

PowerShell只能"看到"安装在$env:PSModulePath目录列表中的模块。否则,您必须使用完整路径导入模块。

要使新模块对所有用户可见,您基本上有两个选项:

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

然而,后者只会在修改后启动的PowerShell会话中生效。


1
PowerShell 3.0及以上版本可以使用上述方法自动加载可找到的模块,因此无需手动导入模块或在配置文件中导入。 - Lars Truijens
2
你最好使用第二个选项,因为https://msdn.microsoft.com/en-us/library/dd878350(v=vs.85).aspx建议不要在C:\Windows\system32\WindowsPowerShell\v1.0\Modules中安装用户模块。 “此位置保留用于与Windows一起提供的模块。请勿将模块安装到此位置。” - Luiz

2

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

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

您的文章链接中的配置文件仅适用于“每个用户”,而上面的配置文件是机器范围内的。 - Knuckle-Dragger
我可以保证,即使使用“-NoProfile”打开 shell,这个程序也能运行吗? - Mike Bailey
很抱歉,我不能这样做。我必须假设该模块将在“-NoProfile”环境中加载。 - Mike Bailey

1

在按照您提出的问题所述步骤后(我认为这是一般情况下的解决方法),我找到了两种方式可以让PowerShell识别新模块源代码:

  • Restart the machine. (Works every time.)
  • Reset the PSModulePath in each open session.

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

    I found this was necessary to run in both normal and elevated prompts to get this to work without restarting in each type of prompt. (See also the conversation @ Topic: PSModulePath.)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接