我试图在Windows中添加C:\xampp\php到我的系统PATH环境变量。

我已经使用环境变量对话框添加了它。

但当我在控制台输入:

C:\>path

它不会显示新的C:\xampp\php目录:

PATH=D:\Program Files\Autodesk\Maya2008\bin;C:\Ruby192\bin;C:\WINDOWS\system32;C:\WINDOWS;
C:\WINDOWS\System32\Wbem;C:\PROGRA~1\DISKEE~2\DISKEE~1\;c:\Program Files\Microsoft SQL
Server\90\Tools\binn\;C:\Program Files\QuickTime\QTSystem\;D:\Program Files\TortoiseSVN\bin
;D:\Program Files\Bazaar;C:\Program Files\Android\android-sdk\tools;D:\Program Files\
Microsoft Visual Studio\Common\Tools\WinNT;D:\Program Files\Microsoft Visual Studio\Common
\MSDev98\Bin;D:\Program Files\Microsoft Visual Studio\Common\Tools;D:\Program Files\
Microsoft Visual Studio\VC98\bin

我有两个问题:

为什么会发生这种情况?我做错什么了吗? 另外,如何使用控制台(并以编程方式,使用批处理文件)向PATH变量添加目录?


当前回答

当遇到这个问题时,我不得不重新启动Windows。

我运行的是Windows 7 x64。我手动更新了系统PATH变量。如果我从统计菜单中运行cmd.exe,这可以正常工作。但如果我在Windows资源管理器地址栏中输入“cmd”,它似乎从其他地方加载PATH,而这并没有我的手动更改。

(为了避免怀疑-是的,在重新启动之前,我确实关闭并重新运行了几次cmd,但它没有帮助。)

其他回答

控制面板的一个更好的选择是使用SourceForge的免费程序Pathenator。

但是,它只适用于。net 4.0或更高版本的系统,如Windows 7、Windows 8或Windows 10。

警告:此解决方案可能会破坏您的PATH和系统的稳定性。作为副作用,它将合并用户和系统PATH,并将PATH截断为1024个字符。此命令的效果是不可逆转的。首先备份PATH。有关更多信息,请参阅评论。 不要盲目地复制粘贴。请谨慎使用。

你可以使用setx命令永久地添加一个路径到path:

setx /M path "%path%;C:\your\path\here\"

如果您想设置用户PATH而不是系统PATH,请删除/M标志。

注:

setx命令仅适用于Windows 7及以上版本。 您应该从提升的命令提示符运行此命令。 如果您只想为当前会话更改它,请使用set。

这只是修改注册表。现有的进程不会使用这些值。如果一个新进程在此更改之后启动,并且不从其父进程继承旧环境,那么它将这样做。

您没有指定如何启动控制台会话。确保这一点的最佳方法是退出命令shell并再次运行它。然后它应该继承更新后的PATH环境变量。

当遇到这个问题时,我不得不重新启动Windows。

我运行的是Windows 7 x64。我手动更新了系统PATH变量。如果我从统计菜单中运行cmd.exe,这可以正常工作。但如果我在Windows资源管理器地址栏中输入“cmd”,它似乎从其他地方加载PATH,而这并没有我的手动更改。

(为了避免怀疑-是的,在重新启动之前,我确实关闭并重新运行了几次cmd,但它没有帮助。)

更安全的 SETX

对@Nafscript的初始SETX答案的所有注释点头。

默认情况下SETX将更新您的用户路径。 对于SETX……/M将更新您的系统路径。 %PATH%包含附加用户路径的系统路径

警告

备份你的路径- SETX将截断你的垃圾超过1024个字符 不要调用SETX %PATH%;xxx -将系统路径添加到用户路径中 不要调用SETX %PATH%;xxx /M -将用户路径添加到系统路径中 过度使用批处理文件会导致盲目

ss64 SETX页面有一些非常好的例子。重要的是,它指向了SETX vs SETX /M的注册表项的位置

用户变量: HKCU \环境 系统变量: HKLM \ SYSTEM \ CurrentControlSet \ \会话管理器\环境控制

使用说明

附加到用户路径

append_user_path.cmd

@ECHO OFF
REM usage: append_user_path "path"
SET Key="HKCU\Environment"
FOR /F "usebackq tokens=2*" %%A IN (`REG QUERY %Key% /v PATH`) DO Set CurrPath=%%B
ECHO %CurrPath% > user_path_bak.txt
SETX PATH "%CurrPath%";%1

附加到系统路径

append_system_path.cmd。必须以管理员身份运行。

(除了Key和SETX /M修饰符不同之外,基本上是一样的。)

@ECHO OFF
REM usage: append_system_path "path"
SET Key="HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
FOR /F "usebackq tokens=2*" %%A IN (`REG QUERY %Key% /v PATH`) DO Set CurrPath=%%B
ECHO %CurrPath% > system_path_bak.txt
SETX PATH "%CurrPath%";%1 /M

选择

最后,ss64 SETX页面推荐了一个名为SETENV的改进版本,它将设置用户或系统环境变量分开。


例子

下面是在Windows 7上设置PATH环境变量的完整示例。该示例在尝试更改值之前检测软件是否已经添加到PATH。与上面给出的例子有一些小的技术差异:

@echo off
set OWNPATH=%~dp0
set PLATFORM=mswin

if defined ProgramFiles(x86)                        set PLATFORM=win64
if "%PROCESSOR_ARCHITECTURE%"=="AMD64"              set PLATFORM=win64
if exist "%OWNPATH%tex\texmf-mswin\bin\context.exe" set PLATFORM=mswin
if exist "%OWNPATH%tex\texmf-win64\bin\context.exe" set PLATFORM=win64

rem Check if the PATH was updated previously
echo %PATH% | findstr "texmf-%PLATFORM%" > nul

rem Only update the PATH if not previously updated
if ERRORLEVEL 1 (
  set Key="HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
  for /F "USEBACKQ tokens=2*" %%A in (`reg query %%Key%% /v PATH`) do (
    if not "%%~B" == "" (
      rem Preserve the existing PATH
      echo %%B > currpath.txt

      rem Update the current session
      set PATH=%PATH%;%OWNPATH%tex\texmf-%PLATFORM%\bin
      
      rem Persist the PATH environment variable
      setx PATH "%%B;%OWNPATH%tex\texmf-%PLATFORM%\bin" /M
    )
  )
)

1. 并不完全正确