【问题标题】:Powershell 5.0 doesn't see PATH environment variables under User accountPowershell 5.0 在用户帐户下看不到 PATH 环境变量
【发布时间】:2020-10-16 15:29:22
【问题描述】:

我在System Path -> C:\Program Files\TEE-CLC 中添加了一个环境变量。在那之后,我希望我可以在不提供完整路径的情况下从 PowerShell 运行位于 C:\Program Files\TEE-CLC 下的 foo.exe。问题是当我在我的用户下启动一个新的、全新的 Powershell 会话时,它看不到新添加的路径,但是当我在管理员下启动它时一切正常。

我在两种模式下检查了$env:PathUserAdmin),发现我在User下时我的新路径不存在,但是当Powershell为as Administrator时我可以看到它

如何使我新添加的变量在 User 而不是 Administrator 下运行可见?

更新 我在User 下运行了 2 个命令,结果不同。为什么$env:Path 不显示与[System.Environment]::GetEnvironmentVariable('PATH', 'MACHINE') 相同的输出以及为什么当前PSSession 看不到后一个命令的路径?`

复制步骤

  1. 添加环境路径变量[Environment]::SetEnvironmentVariable('PATH', ($env:Path + ';C:\Program Files\Foo'), 'MACHINE')
  2. 关闭会话
  3. 以用户身份打开一个新的 ps 会话 -> 检查$env:PATH -> C:\Program Files\Foo 不在那里
  4. 以管理员身份打开一个新的 ps 会话 -> 检查 $env:PATH -> C:\Program Files\Foo 那里

【问题讨论】:

  • 如何将“C:\Program Files\FOOPATH”添加到 PATH 变量中? SETX?图形用户界面?
  • @lit 它是从 PS 脚本中添加的,使用 [Environment]::SetEnvironmentVariable('PATH', $UpdatedPathList, 'MACHINE')
  • 要更改Path 的值,您可以使用[Environment]::SetEnvironmentVariable("Path", $Env:Path + ";C:\SomeLocation", "Machine"),因此很遗憾,您没有显示或提供专门定义$UpdatedPathList 变量值的代码,我们不知道它是否包含所需的信息。您还需要了解,虽然您可能已将其添加到系统、(机器) 环境中,但您的 PS 会话仅继承启动时定义的内容,新添加的内容不会传播到现有会话中.
  • 当您查看Path 值时,它将显示在 PS 会话打开时在 MachineUser 下可用的所有值,以及在该会话中创建的任何值,即Process。如果您想在MachineUser 中创建一个持久变量,并且还希望在同一会话中使用它,您还需要将其定义为Process 变量,例如$Env:Path += ";C:\SomeLocation",或[Environment]::SetEnvironmentVariable("Path", $Env:Path + ";C:\SomeLocation", "Process")
  • @Compo 还有一点:1)我明确提供了我运行的信息The issue is when I start a new, fresh Powershell session 2)看看图片,路径就在那里。因此,它被正确地提供给SetEnvironmentVariable 函数。我想我需要提供更多信息,因为显然,这个问题并不清楚。转到“重现的步骤”部分,以重现您机器上的行为

标签: powershell environment-variables powershell-5.0


【解决方案1】:

除非我遗漏了什么,否则我无法重现您的问题,这里是示例,我刚刚为您在一台测试机器上执行。

首先我打开了一个提升的powershell.exe 窗口,即“作为管理员”:

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

Try the new cross-platform PowerShell https://aka.ms/pscore6

PS C:\WINDOWS\system32> $Env:Path
C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Users\Tester\AppData\Local\Microsoft\WindowsApps
PS C:\WINDOWS\system32> [Environment]::SetEnvironmentVariable('Path', ($Env:Path + ';C:\Program Files\Foo'), 'MACHINE')
PS C:\WINDOWS\system32> $Env:Path
C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Users\Tester\AppData\Local\Microsoft\WindowsApps
PS C:\WINDOWS\system32> [Environment]::GetEnvironmentVariable('Path', 'MACHINE')
C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Users\Tester\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Foo
PS C:\WINDOWS\system32>

然后我打开了一个新的非提升powershell.exe 窗口:

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

Try the new cross-platform PowerShell https://aka.ms/pscore6

PS C:\Users\Tester> $Env:Path
C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Users\Tester\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Foo;C:\Users\Tester\AppData\Local\Microsoft\WindowsApps;
PS C:\Users\Tester> [Environment]::GetEnvironmentVariable('Path', 'MACHINE')
C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Users\Tester\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Foo
PS C:\Users\Tester>

如您所见,C:\Program Files\Foo 显示在两个示例输出中。

然后我打开了另一个新的提升powershell.exe 窗口:

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

Try the new cross-platform PowerShell https://aka.ms/pscore6

PS C:\WINDOWS\system32> $Env:Path
C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Users\Tester\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Foo;
PS C:\WINDOWS\system32> [Environment]::GetEnvironmentVariable('Path', 'MACHINE')
C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Users\Tester\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Foo
PS C:\WINDOWS\system32>

如您所见,C:\Program Files\Foo 显示在两个示例输出中。

【讨论】:

  • 谢谢!它可能与环境有关。会想办法解决的
【解决方案2】:

这个问题突然出现在我面前,至少我自己能够解决。

警告:在运行任何东西之前备份您的 PATH。有 1024 通道的限制,所以要小心。

背景

作为用户(非管理员),您的$Path 相当于[System.Environment]::GetEnvironmentVariable('PATH', 'USER'),而作为管理员,您的$Path 相当于[System.Environment]::GetEnvironmentVariable('PATH', 'MACHINE')。可能有很多情况下您希望将它们分开。在我的情况下,我的“MACHINE”$Path 下的所有内容都是我作为普通用户想要的东西,所以我将展示如何组合这些路径,以便无论你如何运行 powershell,你都将拥有相同的路径。

流程

  1. 以管理员身份打开 cmd.exe(在 powershell 中可能有一种方法可以做到这一点,但这种方法似乎更容易,并且适用于 powershell 正常)
  2. 将组合路径添加到用户路径:
setx path "%path%"

(在cmd中%path%是用户路径和机器路径的组合)

  1. (额外)将组合路径添加到系统路径:
setx /M path "%path%"
  1. 重启 powershell。您期望的可执行文件现在应该可以作为用户使用了。

【讨论】:

    猜你喜欢
    • 2018-04-18
    • 2014-08-03
    • 2020-05-07
    • 1970-01-01
    • 2014-02-11
    • 2020-03-07
    • 1970-01-01
    • 2021-10-20
    • 2019-03-01
    相关资源
    最近更新 更多