为什么我的PATH环境变量与命令提示符不同?


11

一些重要的背景知识:我的公司有一个通用的登录VBS脚本,该脚本在登录时对用户PATH环境变量进行了修改,并允许我运行依赖于映射的DFS文件共享的软件。我最近还将Windows Powershell SDK安装到了Windows 7 Enterprise计算机上,并尝试从Powershell命令行尝试修改PATH环境变量。

此后,我注意到我无法再运行与这些登录PATH修改相对应的应用程序,并且环境变量编辑器PATH的设置与我'echo %PATH%'从命令提示符下发出时所显示的不同。

例如(简化),从环境变量编辑器(My Computer properties -> Advanced System Settings -> Environment Variables)中

 C:\MyDir\; C:\MyOtherDir

而当我'echo %PATH%'从命令提示符处执行操作时,得到了:

 C:\MyDir\

还有其他人有类似的问题吗,是否有某种解决方案?当我用谷歌寻求帮助时,我想到了这一点:

(相关?)StackOverflow线程

在我看来,如果登录脚本不是由Explorer.exe环境启动的,那就是问题所在。但是,当我自己运行登录脚本时,命令提示符下的PATH保持不变。这与PowerShell有什么关系?我不知道如何将其完全连接到该安装。


您如何在Powershell中修改路径?您在哪里回声%PATH%?在cmd.exe中?
Werner Henze

下面的答案是天才。
SDsolar '17

Answers:


11

Windows有两类环境变量:系统环境变量用户环境变量。如果您正在使用echo %PATH%,将看到您的用户环境变量 PATH。仅当未定义用户变量时,系统变量对用户进程才有效。

PATH分离器;不应该跟一个空白。

以下Microsoft注释可能会有所帮助:

您可以通过编辑以下注册表项来修改用户环境变量:

   HKEY_CURRENT_USER \ 
         Environment

您可以通过编辑以下注册表项来修改系统环境变量:

   HKEY_LOCAL_MACHINE \ 
               SYSTEM \ 
    CurrentControlSet \ 
              Control \ 
      Session Manager \ 
          Environment

请注意,任何需要扩展的环境变量(例如,当使用时%SYSTEM%)必须作为REG_EXPAND_SZ注册表值存储在注册表中。REG_SZ从注册表中读取时,不会扩展任何类型的值。

附加说明: 每当进程更改其环境(而不是为新进程定义环境的注册表设置)时,所做的更改仅对子进程可见。


1
我想强调Axel的观点,如果您需要修改环境变量,那么您需要在注册表中进行更改。实际上,我创建了一个PowerShell函数来解决此问题:computerperformance.co.uk/powershell/powershell_env_path.htm
Guy Thomas

1
没有要修改的值,只有两个变量tmptemp。您确定这是用户的路径,应该修改吗?
Johnny_D

这似乎不起作用(至少在重启之前)。路径变量不在HKCU \ Environment中,cmd.exe中的路径变量正确显示,但是启动的应用程序仍然看到旧的路径变量。
Martin Argerami '17

@Martin:是的,启动的应用程序无法识别注册表更改,因为它们会在应用程序启动期间获取环境的内存副本。此副本取决于启动子流程的父流程。例如,如果它们是从Windows资源管理器启动的,则必须重新启动资源管理器才能获取新的PATH。
Axel Kemper'2

你把它钉在头上了!其中的路径添加了一些我已经删除的程序,例如Microsoft SQL。我知道它不是来自我设置的系统属性路径。非常感谢-从未来开始-您在3年前发布了此答案。
SDsolar '17
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.