为什么我的Windows 8命令行不更新其路径


21

我需要在PATH变量中添加一个新条目。这是我工作中的常见活动,但是最近我开始使用Windows8。我认为该过程类似于Windows 7,Vista,XP ...

这是我的事件顺序:

  1. 打开系统属性(开始-> [类型“控制面板”]->控制面板\系统和安全性\系统->高级系统设置->环境变量)
  2. 将新路径添加到我的USER PATH变量的开头(C:\ dev \ Java \ apache-ant-1.8.4 \ bin;)
  3. 打开命令提示符(开始-> [键入“命令提示符”输入]-> [键入“路径”输入]

我的新路径条目不可用(请参阅所附图像和视频)。我在Windows 7机器上复制了完全相同的过程,并且可以正常工作。

屏幕抓取环境变量

编辑

Windows 8环境变量和命令提示符视频

编辑

这绝对不是Windows 7的行为。观看此视频,以查看我期望在Windows 7中运行的行为。http://youtu.be/95JXY5X0fII

编辑5/31/2013

因此,经过无奈之后,我编写了一个小型C#应用程序来测试WM_SETTINGCHANGE事件。这段代码在Windows 7和Windows 8中都接收到该事件。但是,我在Windows 7中使用。在其他Windows 8系统中无法复制。

这是C#代码。

using System;
using Microsoft.Win32;

public sealed class App
{
    static void Main()
    {
        SystemEvents.UserPreferenceChanging += new UserPreferenceChangingEventHandler(OnUserPreferenceChanging);

        Console.WriteLine("Waiting for system events.");
        Console.WriteLine("Press <Enter> to exit.");
        Console.ReadLine();
    }

    static void OnUserPreferenceChanging(object sender, UserPreferenceChangingEventArgs e)
    {
        Console.WriteLine("The user preference is changing. Category={0}", e.Category);
        Console.WriteLine("path={0}", System.Environment.GetEnvironmentVariable("PATH"));
    }
}

OnUserPreferenceChanging 相当于 WM_SETTINGCHANGE

Windows 7中运行的C#程序(您可以看到事件通过,它将选择正确的路径)。

Windows 8中运行的C#程序(您可以看到事件通过,但是路径错误)。

我的环境有一些问题正在加剧。但是,这是Windows 8的错误吗?

编辑2014-04-28

由于这个问题和其他一些问题,我们不再在桌面上使用Windows 8。我们没有环境可以继续测试和试验此问题。对于我们来说,仍然没有答案或解决方案。下面的答案不能解决我们的问题。


2
我认为您需要在进行更改后重新启动它们才能生效。
谜团

@谜为什么?我不需要在Windows 7,Vista,XP,2000中重新启动...
mawcsco 2013年

@mawcsco您至少参加过7次。从开始菜单打开打开命令提示符时,将使用从登录时加载的资源管理器外壳启动环境。您需要终止/重新启动资源管理器,注销或重新登录或重新启动系统。
达斯Android

1
@Enigma不需要重新启动。serverfault.com/questions/8855/…–
mawcsco

1
我刚刚在Windows 7和Windows 8上都进行了检查:无论哪种情况,在cmd启动新实例时都可以看到新的环境变量。当然,已经运行的cmd没有获得更新的环境。
阿列克谢·伊凡诺夫

Answers:


7

如果要从开始菜单或任务栏上的快捷方式启动命令提示符,则必须:

  • 重新启动explorer。杀死并重新启动它。
  • 注销并重新登录(这将有效地重新启动explorer)。
  • 重新启动系统(这也会有效地重新启动explorer)。

该环境不会立即更新,因为环境是从其父进程继承而来的,除了explorer,该环境是在登录时由系统启动的。这就是我的Windows 7系统上的行为。

因此,更改环境变量将更新注册表项,但是在系统必须为正在启动的某些进程构建新的登录环境之前,不会重新读取这些注册表项。在大多数情况下,这种情况不会发生,因为流程是已经具有环境的流程的子级,因此该环境是继承的。


2
对于Windows 7绝对为false。请参见上面我在我的文章中链接的视频。
mawcsco 2013年

1
嗯 您肯定是对的,尽管以前我所做的更改绝对不会立即应用于Win 7上的新控制台窗口。不过,我不记得我的确切工作流程是什么。如果到那时没人能为您解答,我将在回家时使用Win 8系统。
达斯Android

5
如果使用“系统属性”对话框更改了环境变量,则更改将立即应用于当前正在运行的Explorer实例,此后启动的所有进程都将获得新的环境。除非正在处理的进程处理WM_SETTINGCHANGE消息,否则它们不会自动更新其环境变量。
阿列克谢·伊凡诺夫

1
杜德,这帮助我理解了我目前遇到的问题。我使用AutoHotkey启动命令提示符,直到重新启动autohotkey才起作用!
Moss 2014年

1
@mawcsco它为我工作,我正在使用Windows7。–
laike9m 2015年

3

来自:http : //support.microsoft.com/kb/104011通过/server//q/8855/158027

...

但是,请注意,修改环境变量不会立即导致更改。例如,如果在进行更改后启动另一个“命令提示符”,则环境变量将反映先前(而不是当前)的值。在您注销然后重新登录之前,更改不会生效。

要实现这些更改而不必注销,请向系统中的所有窗口广播WM_SETTINGCHANGE消息,以便任何感兴趣的应用程序(例如Windows资源管理器,程序管理器,任务管理器,控制面板等)都可以执行更新。更多信息


例如,在基于Windows NT的系统上,以下代码片段应将更改传播到命令提示符中使用的环境变量:

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
    (LPARAM) "Environment", SMTO_ABORTIFHUNG,
    5000, &dwReturnValue);

Windows 95和Windows 98附带的所有应用程序(包括Windows资源管理器和程序管理器)均未响应此消息。因此,尽管本文可以从技术上在Windows 95和Windows 98上实现,但是除通知第三方应用程序外没有其他作用。在Windows 95上更改全局环境变量的唯一方法是修改autoexec.bat文件并重新启动。


2
Windows 7中的Windows资源管理器可以处理此消息,足以从任务栏或“开始”菜单重新启动命令提示符。
阿列克谢·伊凡诺夫

“如果通过有问题的计算机的“属性”主对话框进行更改,则对环境变量的更改应立即生效(转到“我的电脑” |“属性” |“高级” |“环境变量”。保存更改后,资源管理器将广播WM_SETTINGCHANGE消息)所有窗口以通知他们更改。” serverfault.com/questions/8855/…–
mawcsco

2
“系统提示本文适用于与您使用的Windows不同的Windows版本。本文中的内容可能与您不相关。请访问Windows 8解决方案中心”
mawcsco

这是一个实现细节,并且微软无意在Windows 8或更高版本中支持此行为,这也不足为奇。
surfasb

1

问题出在您的用户设置上。在Window 8中,每个用户都有自己的环境变量。

打开系统属性(开始-> [类型“控制面板”]->控制面板\系统和安全性\系统->高级系统设置->环境变量)

上面的方法将为root用户(可能不是您当前的用户)编辑环境变量。

您应该转到用户帐户->选择当前帐户->更改环境变量

更改后,重新启动电源外壳。然后

echo $env:JAVA_HOME

要么

Get-ChildItem env

希望这会帮助你。


我想您可能已经错过了我的屏幕快照和视频中的细节,该屏幕快照和视频显示了带有“ mwillia3的用户变量”对话框。那是我的用户名。我肯定知道我正在编辑正确的环境变量。C#应用会使用旧值而不是更新值来触发事件。我放弃。我相当确定这是Win 8的错误,并且我不再可以使用Windows 8进行测试。
mawcsco 2014年

有些人并不总是阅读细节。我在某些系统而不是其他系统上看到了这一点,甚至在Windows 7/2008上也看到了。我发现没有韵律或原因。
ferventcoder

即使传播WM_SETTINGSCHANGED,Windows Server 2012 r2也会出现同样的问题。我相信这是Windows错误。
vezenkov '16

0

尝试使用SETX代替SET。例如SETX PATH "%PATH%;MyPath"


1
你能解释为什么 SETX而不是SET工作。
克里斯夫·

首先,我没有使用命令行,而是在使用系统对话框。其次,我的行为模式在Windows 7中可以正常工作,但有时在Windows 8中却不能。
mawcsco 2014年

0

如果您使用的是Windows 8.1,请以管理员身份打开命令提示符,然后调用PATH命令,您应该会看到它出现在此处。当您恢复正常的cmd时,它也会显示出来。实际上,您应该能够从命令提示符启动添加的应用程序。



-1

如果从桌面使用Win + R来启动cmd.exe,是否可以使用?我的猜测是,从“开始”屏幕启动它会导致启动的cmd.exe的父级与explorer.exe(WSAHost.exe,IIRC或其他名称)有所不同,并且父进程不会在WM_SETTINGCHANGE消息期间更新其环境。我手头没有Windows 8机器来测试...


即使在Windows 8中,“开始屏幕”用户界面似乎也都是explorer.exe的一部分,因为当explorer.exe被杀死时,它会消失。
宾基
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.