我试图在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变量添加目录?


当前回答

更安全的 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. 并不完全正确

其他回答

命令行更改将不是永久的,并且将在控制台关闭时丢失。 这条路就像先到先得一样。 您可能希望覆盖其他已经包含的可执行文件。例如,如果您的路径上已经有了另一个版本,而您希望添加不同的版本,而不需要对路径进行永久更改,则应该将目录放在命令的开头。

重写已包含的可执行文件;

设置路径= C: \ xampp \ php; % %路径;

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

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

我会用PowerShell代替!

使用PowerShell将一个目录添加到PATH,执行以下操作:

$PATH = [Environment]::GetEnvironmentVariable("PATH")
$xampp_path = "C:\xampp\php"
[Environment]::SetEnvironmentVariable("PATH", "$PATH;$xampp_path")

要为机器范围内的所有用户设置变量,最后一行应该如下所示:

[Environment]::SetEnvironmentVariable("PATH", "$PATH;$xampp_path", "Machine")

在PowerShell脚本中,您可能希望在添加到PATH之前检查是否存在C:\xampp\php(以防之前已经添加了它)。你可以用if条件句把它包装起来。

所以把它们放在一起:

$PATH = [Environment]::GetEnvironmentVariable("PATH", "Machine")
$xampp_path = "C:\xampp\php"
if( $PATH -notlike "*"+$xampp_path+"*" ){
    [Environment]::SetEnvironmentVariable("PATH", "$PATH;$xampp_path", "Machine")
}

更好的是,可以创建一个泛型函数。只需提供您希望添加的目录:

function AddTo-Path{
param(
    [string]$Dir
)

    if( !(Test-Path $Dir) ){
        Write-warning "Supplied directory was not found!"
        return
    }
    $PATH = [Environment]::GetEnvironmentVariable("PATH", "Machine")
    if( $PATH -notlike "*"+$Dir+"*" ){
        [Environment]::SetEnvironmentVariable("PATH", "$PATH;$Dir", "Machine")
    }
}

你可以通过打磨来让事情变得更好。例如,使用Test-Path确认目录确实存在。

选项1

在使用GUI更改PATH之后,关闭并重新打开控制台窗口。

这是可行的,因为只有在更改之后启动的程序才能看到新的PATH。

选项2

此选项仅影响当前shell会话,而不会影响整个系统。在已打开的命令窗口中执行以下命令:

set PATH=%PATH%;C:\your\path\here\

该命令将C:\your\path\here\追加到当前路径。如果路径包含空格,则不需要包含引号。

分解一下:

set -仅为当前cmd会话更改cmd的环境变量的命令;其他程序和系统不受影响。 PATH= -表示PATH是要临时更改的环境变量。 %PATH%;C:\your\ PATH \here\ - %PATH%部分扩展为PATH的当前值,然后;C:\your\ PATH \here\被连接到它。这将成为新的PATH。

在Windows 10上,我能够搜索set path环境变量,并得到这些指令:

From the desktop, right-click the very bottom-left corner of the screen to get the Power User Task Menu. From the Power User Task Menu, click System. In the Settings window, scroll down to the Related settings section and click the System info link. In the System window, click the Advanced system settings link in the left navigation panel. In the System Properties window, click the Advanced tab, then click the Environment Variables button near the bottom of that tab. In the Environment Variables window (pictured below), highlight the Path variable in the System variables section and click the Edit button. Add or modify the path lines with the paths you want the computer to access. Each different directory is separated with a semicolon, as shown below:

C:\程序文件;C:\Winnt;C:\Winnt\System32

我第一次搜索它时,它立即弹出了系统属性窗口。之后,我找到了上面的说明。