为什么setx path无法工作?

11

有人能解释一下这个结果吗?

设置路径后,它并没有改变。 这是在管理员命令行中运行的:

C:\Windows\system32>setx path "C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\ProgramData\chocolatey\bin;D:\Program Files (x86)\Microsoft VS Code\bin"

SUCCESS: Specified value was saved.

C:\Windows\system32>path
PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\ProgramData\chocolatey\bin;D:\Program Files (x86)\Microsoft VS Code\bin;D:\Program Files (x86)\metapad36;D:\Program Files (x86)\metapad36" /M

我读到过%PATH%=机器的PATH变量+用户的PATH变量。 我是不是看到了机器路径和管理员的路径?

查看了其他有关此主题的文章,但仍然感到困惑。

我应该清除用户路径,这样就不会重复了吗?

更新:关于“此工具创建或修改的变量将在以后的命令窗口中可用”的提示,我打开一个非管理员窗口并输入:

>path
PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\ProgramData\chocolatey\bin;D:\Program Files (x86)\Microsoft VS Code\bin;;D:\Program Files (x86)\metapad36;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\ProgramData\chocolatey\bin;D:\Program Files (x86)\Microsoft VS Code\bin

路径被重复了两次。好的,在同一个提示符下,我使用setx设置了没有重复和没有/M的路径:

>setx path "C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\ProgramData\chocolatey\bin;D:\Program Files (x86)\Microsoft VS Code\bin"

SUCCESS: Specified value was saved.

显然保存在当前用户环境中。

然后我打开一个新的非管理员命令窗口,并输入:

>path
PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\ProgramData\chocolatey\bin;D:\Program Files (x86)\Microsoft VS Code\bin;;D:\Program Files (x86)\metapad36;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\ProgramData\chocolatey\bin;D:\Program Files (x86)\Microsoft VS Code\bin`

它没有变化。为什么?


如果“重复”来自系统变量,则需要在提升的cmd提示符下setx /M修正的path(当然)。更改用户值的path不会“删除”在path的系统值中定义的条目。 - dxiv
听起来你是在说在非管理员命令行输入的path返回系统级路径,而不是用户级路径。真的吗?我注意到在非管理员命令行输入path返回的结果与在管理员命令行输入的不同。但如果两种情况都返回系统路径,为什么它们会不同呢?谢谢。 - johny why
不,你误解了。你只需要通过提升的命令提示符才能允许setx /M更改系统环境变量path。除此之外,提升(以管理员身份运行)和常规(非提升)的 cmd 提示符具有相同的环境。请注意,特别是PATH是系统 PATH + 用户 PATH 的组合,例如参见Windows NT 中的环境变量用户路径会附加到系统路径上。如果你以某种方式将它们都设置为相同的值,则生成的 PATH 将包含重复项,就像你看到的那样。 - dxiv
4个回答

23
在Windows中,每个进程都会获得一个环境的拷贝,这本质上是在进程启动时全局环境的一个快照。当进程运行时对全局环境所做的更改不会传播回进程自己的环境拷贝中。
回答实际问题,setx确实修改了用户环境(如果使用/M运行,则为系统环境),但是在执行setx的进程中(在这种情况下是cmd.exe)看不到更改。如果在运行setx后打开一个新的命令提示符,您将在该实例的cmd.exe中看到更改。
setx /?帮助明确指出了这一点:
在本地系统上,此工具创建或修改的变量将在未来的命令窗口中可用,但不在当前CMD.exe命令窗口中可用。
要在全局环境和当前进程的环境中实现相同的更改,需要同时运行setx和set。

我有一个类似的情况,但在以管理员身份运行的shell中设置环境变量和注册表(当前用户和系统范围内的变量)中的PATH是正确的,因为我在注册表编辑器中设置了它。即使重新启动后,$Env:PATHecho %path%仍显示具有重复项的路径。 Setx成功执行,但对于后续的shell实例没有任何更改,set仅更改当前shell会话的PATH。如何使我的路径同步? - Yar
@Yar 没有任何细节很难猜测。首先要检查的是每次更改后的用户和机器环境,例如请参见此处。如果这与您的期望不符,您应该发布一个单独的问题,并提供重现问题的确切步骤。 - dxiv

3

提醒大家,如果您发现这篇旧文章……

使用SETX(以及通过PowerShell、.Net、C#等进行的大多数其他编程方法)仅对由运行SETX的用户运行的新进程立即生效。如果SETX由不同的用户或系统帐户(如大多数公司部署产品所需)运行,则其他用户接收更新仍需要重新启动。甚至关闭Explorer.exe并在受影响的用户下重新运行也无法刷新。

当您通过标准Windows GUI修改环境变量时,Microsoft会对shell环境进行一些程序化操作。


1
首先,以管理员用户身份打开您的cmd,然后运行setx命令。

0
根据文档,setx命令只会在下一个终端会话中反映更改。
要立即在同一终端中反映更改,您可以通过赋值来更改变量的值。
$env:VAR_test = "test value"

准备就绪。


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