如何永久从PowerShell的$env:PSModulePath中删除UNC路径?

9
我所在的工作环境中,用户的文件夹被重定向到UNC路径以便保存数据。这似乎影响了我的PowerShell,因为每次我启动它时,它都会尝试从UNC路径加载模块,需要很长时间。这还影响了我使用cmdlets的方式,因为它试图在UNC路径中搜索cmdlet上下文。
当我查看$env:PSModulePath的输出时,我可以看到UNC目录。但在“系统的环境变量”对话框编辑器中却没有显示出来。
如何才能摆脱这个问题,使得Powershell不再从UNC目录寻找模块支持呢?我知道我可以编辑已存在的$env:PSModulePath,但我希望这个问题能永久消失。

检查 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\', 'HKCU:\Environment\' | ForEach-Object {(Get-Item "$_").GetValue('PSModulePath')} - JosefZ
这个注册表键中没有显示UNC路径。 - Anthony Klotz
如果UNC路径存在,请检查1. dir env:\ | Where-Object Value -Match ([regex]::Escape( "\\" ))2. $profile | gm -type noteproperty | % { $_.Name; sls -Path $profile.$($_.Name) -Pattern $([regex]::Escape( '\\'))} - JosefZ
在执行上述操作之前,请检查是否可以通过省略运行 powershell -noprofile 的配置文件来验证所描述的行为是否发生? - JosefZ
我仍然会在运行powershell.exe -noprofile时得到这种行为。运行脚本dir env:\ | Where-Object Value -Match ([regex]::Escape( "\\" ))后,我得到了3个命中点。UNC路径显示在以下名称中: HOMESHARELOGONSERVERPSModulePath。第二个脚本返回错误,因为它找不到profile.ps1文件。 - Anthony Klotz
LogonServer 环境变量的存在表明您处于 环境中。请向您的域管理员询问... - JosefZ
6个回答

5
微软文档页面about_PSModulePath进行了解释。默认情况下,PowerShell通过串联以下内容来构建$env:PSModulePath的值:
  • 用户的“文档”文件夹,可能是你提到的UNC路径。
  • PSModulePath系统环境变量的内容。

你可以按如下方式找到“文档”文件夹的路径:

[Environment]::GetFolderPath('MyDocuments')

如果您定义了一个用户级环境变量 PSModulePath ,并且除系统环境变量 PSModulePath 之外,这将替换您在 $env:PSModulePath 中的“文档”文件夹,该文件夹不再包含UNC路径。

0
我解决这个问题的方法是在所有用户配置文件中设置模块路径。
对于我来说,$PROFILE.AllUsersAllHosts 返回:
C:\Program Files\PowerShell\7\profile.ps1
我创建了该文件并添加了以下内容:
$ModulePath = "c:\program files\powershell\7\Modules"
[Environment]::SetEnvironmentVariable("PSModulePath", $ModulePath)

0

要永久更改PSModulePath环境变量,您可以使用 System.Environment 类上的 .NET 方法SetEnvironmentVariable

例如:

[Environment]::SetEnvironmentVariable("PSModulePath", "Some_Path", "Machine")

请注意,这将覆盖此变量之前的内容。因此,在运行该方法之前,请确保PSModulePath肯定包含您需要的路径。

另外,如果您的公司正在使用GPO设置PSModulePath变量,则唯一删除UNC路径的方法是与处理此事的管理员交谈。


在使用.NET方法设置路径后,UNC路径仍然存在。看起来某个时候GPO会重新设置它,所以我的目标是运行一个PowerShell脚本,在注册表中查找并删除它,无论GPO何时再次设置它。 - Anthony Klotz
.NET方法只会影响未来的PowerShell会话。因此,您必须打开一个新的PowerShell会话才能看到更改。我建议您与公司核实是否允许这样做。规避组策略可能会带来后果。 - Peter Kay

0

设置PSModulePath用户环境变量无法阻止Powershell自动在每个会话的开头将%userprofile%\Documents添加到PSModulePath变量中。我只能通过创建配置文件并手动覆盖那里的PSModulePath环境变量,才能删除我不需要的UNC文档路径。

  1. 输出$profile并在该位置创建.ps1文件(如果不存在)
  2. 添加一行代码手动设置PSModulePath环境变量为正确的路径列表,排除任何有问题的UNC路径(例如:$Env:PSModulePath = 'C:\Program Files\PowerShell\Modules;...'

0

我在从设备中删除PowerShell 7后遇到了同样的问题。看起来正在发生的是,在高级系统设置下,将PSModulePath变量更改为我的文档,并从环境变量中删除。然后,PowerShell使用由组策略配置的UNC路径。

对我有效的解决方案是添加一个名为PSModulePath的新环境变量,其值为C:\ Users \ YourUserNameHere \ Documents。现在,PowerShell有一个地方可以查找这些PS模块。


0

我不知道为什么它没有显示在您的系统变量GUI中。您应该能够使用类似以下方式删除它:

$yourvalueyouwanttodelete = 'somepath'
$oldval = [environment]::GetEnvironmentVariable("PSModulePath")
$arr_oldval = $oldval -split ";"
$arr_newval = $arr_oldval | ? {$_ -ne $yourvalueyouwanttodelete}
$newval = $arr_newval -join ";"
[environment]::SetEnvironmentVariable("PSModulePath", $newval)

重新启动 Powershell 会将 UNC 路径恢复到 $env:PSModulePath。 - Anthony Klotz

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