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

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

我需要向 PATH 变量添加新条目。这是我工作中常见的活动,但我最近开始使用 Windows 8。我以为这个过程与 Windows 7、Vista、XP 类似...

以下是我的事件顺序:

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

我的新路径条目不可用(见附图和视频)。我在 Windows 7 计算机上重复了完全相同的过程,并且成功了。

环境变量的屏幕截图

编辑

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

编辑

这绝对不是 Windows 7 的行为。观看此视频以了解该行为我预计在 Windows 7 中工作。http://youtu.be/95JXY5X0fII

编辑于 2013 年 5 月 31 日

因此,在经历了许多挫折之后,我编写了一个小型 C# 应用程序来测试该WM_SETTINGCHANGE事件。此代码在 Windows 7 和 Windows 8 中均接收该事件。但是,在我的系统上的 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。我们没有环境来继续测试和试验这个问题。我们仍然没有答案或解决方案来解决这个问题。下面的答案没有解决我们的问题。

答案1

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

  • 重启explorer。关闭它然后重新启动。
  • 注销并重新登录(有效重新启动explorer)。
  • 重新启动系统(这也有效地重新启动explorer)。

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

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

答案2

从:http://support.microsoft.com/kb/104011通过https://serverfault.com/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 文件并重新启动。

答案3

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

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

上述方法将为 root 用户编辑环境变量,也许不是您当前的用户。

您应该进入用户帐户->选择您当前的帐户->更改环境变量

更改后,重新启动 power shell。然后

echo $env:JAVA_HOME

或者

Get-ChildItem env

希望对你有帮助。

答案4

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

相关内容