【问题标题】:PATH variable different when cmd was run through the context menu通过上下文菜单运行 cmd 时的 PATH 变量不同
【发布时间】:2015-07-04 21:04:30
【问题描述】:

我刚刚花了最后一个小时试图找出为什么我的 PATH 变量没有为我的 cmd.exe 更新。 现在我发现它确实更新了,但仅限于某些条件......
我通过Win+Break -> Change Settings -> Advanced -> Environment Variables...更新了它

现在,当我通过Win+R -> cmd -> Enter 打开一个新命令行时,PATH 变量会显示我设置的任何值。
但是当我通过Shift+Rightclick into folder -> Open command window here 打开一个新命令行时,PATH 变量会显示过时的内容。

我的问题:为什么会发生这种情况,我该怎么办?

【问题讨论】:

  • 您在第一步更新了注册表。在启动进程并且它不继承其父进程的环境之前,这些更改不会生效。您必须重新启动 Explorer.exe,最简单的方法是注销并重新登录。
  • @HansPassant 哇...解决了它。谢谢,将其作为答案发布,以便我接受。
  • @HandPassant,当控制面板更新环境设置时,顶级窗口会收到WM_SETTINGCHANGE 消息,资源管理器为此调用shell32!RegenerateUserEnvironment 重新加载其环境。那么,Explorer(两种情况下的父级)是如何在一种情况下使用新环境而在另一种情况下不使用的呢?也许稍后我会在调试器中查看它以了解发生了什么。从表面上看,重启会话解决了问题,但并不能解释行为。
  • @eryksun:我感觉“在此处打开命令窗口”是第三方插件。 (我在我的机器上看不到它。)所以它可能只是不知道在哪里可以找到环境块的“最新”版本。
  • @HarryJohnston,它在 Windows 7 中。它不应该打开提升的命令提示符,但可能 Forivin 只是禁用了 UAC。

标签: windows cmd environment-variables contextmenu path-variables


【解决方案1】:

正如 Hans Passant 所指出的,问题在于通过资源管理器的上下文菜单运行 cmd 会生成 cmd 作为资源管理器的子进程,导致它从 explorer.exe 继承环境变量,而不是自己获取它们。而且由于进程通常只在开始时加载一次环境变量并且不监听变化,因此资源管理器将过时的变量继承到 cmd 实例。

所以解决方案是简单地重新启动 explorer.exe。

【讨论】:

  • 我很确定 Explorer 也是从“开始”菜单运行的程序的父级,所以我认为原因比这更复杂一些 - Explorer 必须看到环境变量的变化,但无论出于何种原因,实现上下文菜单的代码都忽略了尊重它们。不过这并不重要,因为无论哪种方式,分辨率都是相同的。
  • 它们作为子进程运行到不同的资源管理器进程。 i.snag.gy/wYivz.jpg 但你可能是对的,它比我想象的要复杂一些。也许它只是发生在所有属于 services.exe 的子进程的进程中......
  • 哇,这真的很奇怪。我的意思是,鉴于它是在服务上下文中运行的 explorer.exe 的单独实例,因此环境变量不是最新的是完全合理的。我只是对为什么在服务上下文中运行一个单独的实例感到困惑!顺便说一句,这可能会对从该命令窗口运行的程序产生许多其他副作用,其中一些可能比环境变量问题更糟糕。所以我建议避免使用那个特定的菜单选项。 :-)
  • 当您在资源管理器中设置“在单独的进程中启动文件夹窗口”选项或选择“文件”>“打开新窗口”>“在新进程中打开新窗口”时,会出现“在服务上下文中运行的单独实例” .生成的进程是一个进程外 COM 服务器,它显然不知道(或不敏感) WM_SETTINGCHANGE 消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 2021-01-20
  • 2014-01-27
  • 2015-05-24
  • 1970-01-01
相关资源
最近更新 更多