在Windows中将目录添加到PATH环境变量


523

我试图将其添加C:\xampp\phpPATHWindows中的系统环境变量中。

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

但是当我输入控制台时:

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

我有两个问题:

  1. 为什么会这样呢?我做错了什么吗?
  2. 另外,如何PATH使用控制台(以编程方式,使用批处理文件)将目录添加到变量中?

43
这是主题,因为它是关于“程序员常用的工具”的问题。如果您在Windows上进行开发,而无需修改PATH,我会感到惊讶。为了满足与编程相关的需求,我强调了投票率最高的答案:您可以通过控制台(或通过批处理文件)以编程方式进行此操作。
乔治·斯托克2014年

1
感谢@GeorgeStocker的评论不错,是的,我以编程方式完成了此操作,但是我还没有想到在控制台会话中应用更改后需要重新登录。(我认为它只是在我的情况),但一般最高的投票答案回答了这个问题
Netorica

1
@George-同意,但是就目前而言,此问题是针对超级用户编写的,而不是针对堆栈溢出的。超级用户将提供有关个人使用的Web服务器配置的帮助。堆栈溢出用于编程问题。
jww 2014年

1
退出并打开一个新的控制台...如果您使用的是bash,则可能需要重新启动系统才能使更改继续,具体取决于您使用的方式/方式。
Tracker1 '16

Answers:


148

这只会修改注册表。现有的流程不会使用这些值。如果新进程此更改启动并且不从其父级继承旧环境,则将执行此操作。

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


9
嗯,不,它实际上仅是修改注册表。通过在“控制面板”对话框中执行此操作(而不是使用PATH命令显示命令提示符),应该会显而易见。如果需要,您可以使用SysInternals的Process Monitor轻松地观察它的作用。使用PATH 并不相同,您关闭控制台后所做的任何更改都将丢失。SETX是一种进行持久更改的方法,例如对话框。
Hans Passant 2014年

3
这是对的。在选择新的环境变量之前,您始终必须重新启动控制台会话。
BrainSlugs83 2015年

1
如果WM_SETTINGCHANGE从应用程序发送消息,控制台会话是否会更新变量?stackoverflow.com/a/8358361
John_West,2016年

从理论上讲这是可能的,据我所知,实际上没有实际的CRT实施方法。资源管理器。
汉斯(Hans)Passant

1
证实这一点的背景信息:blogs.msdn.microsoft.com/oldnewthing/20150915-00/?
p=91591

958

选项1

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

之所以有效,是因为只有在更改之后启动的程序才能看到新的PATH

选项2

在打开的命令窗口中执行以下命令:

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

此命令附加C:\your\path\here\到当前PATH

分解:

  • set更改当前cmd会话的 cmd环境变量的命令;其他程序和系统不受影响。
  • PATH=–表示这PATH是要临时更改的环境变量。
  • %PATH%;C:\your\path\here\%PATH%零件扩展为的当前值PATH;C:\your\path\here\然后串联到该值。这成为新事物PATH

16
@Ilya:我的意思是让您在MyComputer-> Properties-> Advanced-> Env Variables-> Path中更改路径后打开控制台窗口。有些Windows应用在启动后会传播环境变量更改,而某些则不会。WinXP cmd.exe没有。
JimR 2012年

7
如果退出控制台并重新运行,则必须重置路径。知道如何使此更改永久生效吗?
David天宇Wong

2
@David天宇Wong如果您遵循“我的电脑”>“属性”>“高级”>“环境变量”>“路径”。并将目录添加到该字符串的末尾,它将保留。只需确保进行更改后打开控制台即可。
theB3RV '02

是的@ theB3RV,这是做简单事情的漫长的路。奇怪的是,无法在控制台中键入任何持久性命令
David天宇Wong 2015年

12
@David天宇Wong刚发现“ SETX是一种进行持久更改的方法,例如对话框。” 所以SETX命令应该这样做
theB3RV

202

警告:此解决方案可能会对您的PATH和系统的稳定性造成破坏。副作用是,它将合并用户和系统PATH,并将PATH截断为1024个字符。此命令的作用是不可逆的。首先备份PATH。有关更多信息,请参见注释。

不要盲目复制并粘贴此内容。请谨慎使用。

您可以使用以下命令永久添加路径:PATHsetx

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

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

笔记:

  • setx命令仅在Windows 7和更高版本中可用。
  • 您应该从提升权限的命令提示符下运行此命令。

  • 如果只想在当前会话中更改它,请使用set


7
SETX /M path "%path%;C:\Program Files (x86)\Git\bin\"设置机器级别上的PATH值
Lu55

7
为什么这不是公认的答案?我想大多数人会想永久地定下自己的道路……
Peter Gordon


9
警告:由于使用了%PATH%变量,此命令将全局env变量与用户变量合并。是不是 这可能会产生有害的副作用,尤其是使用/ M开关
FF_Dev

4
警告2:%PATH%变量可能与环境变量不同步,因为它是在命令提示符启动时加载的,以后也绝不重新加载(即使在执行setx命令时)。也可以通过以前执行的脚本在本地对其进行更改。
FF_Dev

66

您不需要任何setsetx命令,只需打开终端并输入:

PATH

这显示了PATH变量的当前值。现在要添加目录吗?只需键入:

PATH %PATH%;C:\xampp\php

如果出于任何原因要清除PATH变量(根本没有路径或删除其中的所有路径),请键入:

PATH ;

更新资料

就像Danial Wilson在下面的评论中指出的那样,它仅在当前会话中设置路径。要永久设置路径,请setx注意,尽管这将永久设置路径,但不是在当前会话中,所以要永久设置路径,因此您必须启动新命令行以查看更改,更多信息请参见此处

要检查环境变量是否存在或查看其值,请使用ECHO命令:

echo %YOUR_ENV_VARIABLE%

1
它的工作:)那怎么样!'PATH%PATH%;' 我记得那一次
Dustin Woodard

12
我认为这仅适用于cmd会话的实例,请使用setx对其进行永久更改
Daniel Wilson

2
请勿在此添加引号。例如,PATH %PATH%;C:\Program Files\...而不是PATH "%PATH%;C:\Program Files\..."
icc97

4
不要使用setx!您可能会面临路径变量被截断的风险,从而丢失了花费时间设置的许多其他路径。注意上面的警告。
STWilson

1
@STWilson,为时已晚,看不到您的评论!
西洋

48

我会改用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脚本中,您可能需要C:\xampp\php在添加到PATH之前检查是否存在(如果以前已添加)。您可以将其包装成if条件。

所以放在一起:

$PATH = [Environment]::GetEnvironmentVariable("PATH")
$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")
    if( $PATH -notlike "*"+$Dir+"*" ){
        [Environment]::SetEnvironmentVariable("PATH", "$PATH;$Dir", "Machine")
    }
}

您可以做一些抛光来使事情变得更好。例如,Test-Path用于确认您的目录确实存在。


3
SetEnvironmentVariable使用Machine参数进行调用需要您以管理员权限打开PowerShell
InsOp 2013年

令人失望的是,这个“强大”的外壳无法识别%userprofile%或$ userprofile ..但是再说一遍,这就是我们正在谈论的Windows
大约

3
@abbood您正在寻找的是$env:userprofile
nyuszika7h

3
您还应该指定usermachine在中调用GetEnvironmentVariable。否则,$PATH将包含注册表的用户和计算机部分的值,这将在再次存储路径变量时不必要地破坏路径变量。
雷内·尼芬格

35

更安全的SETX

赞@Nafscript初始SETX答案中的所有评论。

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

警告事项

  1. 备份您的文件PATH - SETX会将您的垃圾邮件截断超过1024个字符
  2. 不打电话SETX %PATH%;xxx -将系统路径添加到用户路径
  3. 不打电话SETX %PATH%;xxx /M -将用户路径添加到系统路径
  4. 批处理文件使用过多会导致失明1

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

用户变量:

HKCU\Environment

系统变量:

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

使用说明

附加给用户 PATH

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

附加到系统 PATH

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

(除与KeySETX /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的改进版本,该版本分开设置用户或系统环境变量。


1.并非完全正确


24

晚会晚了-如果您已经在要添加到PATH的目录中,则非常方便。

set PATH=%PATH%;%CD%

编辑:根据评论-与标准Windows cmd一起使用,但不能在Powershell中使用。

对于powershell,%CD%等效为[System.Environment]::CurrentDirectory


1
我的Powershell说%CD%无法识别。
Paulo Matos'3

@PauloMatos可以尝试使用[System.Environment]::CurrentDirectory
nclord 2016年


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

覆盖已经包含的可执行文件;

设置PATH = C:\ xampp \ php;%PATH%;


2

查看Windows 10 LTSB上的上述建议,并瞥见“帮助”概述(在cmd上键入“ command /?”时可以查看),得出的结论是PATH命令更改了系统环境变量路径值仅适用于当前会话,但在重新启动后,所有值均会重置为默认值,就像使用PATH命令之前一样。

另一方面,使用具有管理特权的SETX命令更为强大,它可以永久更改这些值(或至少直到下一次使用此命令或下一次手动GUI操作这些值...为止)。

但是为了清楚起见,我认为在这里分享对我有用的最佳SETX语法用法可能有一天会有所帮助:

SETX PATH "%PATH%;C:\path\to\where\the\command\resides"

应该避免出现等号“ =”,并且您不必担心空格!无需为其中包含空格的路径插入任何引号-分割符号“;” 做这份工作。

SETX后面的PATH关键字定义了应在系统环境变量可能的值之间更改的一组值,以及引号内的%PATH%(单词PATH单词,用百分号包围)指示操作系统离开现有的照原样设置PATH值,并在现有值中添加以下路径(在分割符号“;”之后的路径)。

高温超导


2

关于第2点,我正在使用一个简单的批处理文件,该文件正在PATH为我填充或其他环境变量。因此,默认情况下不会污染环境变量。可以从任何地方访问此批处理文件,因此我可以输入:

c:\>mybatchfile
-- here all env. are available
c:\>php file.php

这是* nix-es和Windows之间的重要区别。批处理在同一Shell中运行,并且退出后(在会话范围内)对环境的更改将保留。但是,这有两种方法:批处理文件会破坏您的环境。(顺便说一句,在* nix-es上,您只需要source这样的文件,例如. mybatchfile)。
Tomasz Gandor

@ grzegorz-gajos,您好,我一直在寻找,您的更多详细信息链接提供404。还有其他选择吗?
devkabiir

抱歉,链接中的内容不再可用。我删除了。
Grzegorz Gajos

1

在命令提示符中,您可以通过在Cmd前面加上来告诉Cmd使用Explorer的命令行start

所以start Yourbatchname

请注意,您必须像注册名称一样注册batchfile.exe

可以将程序和文档添加到注册表中,以便在“开始-运行”对话框或快捷方式中键入其名称而无需路径,Windows可以找到它们。

这是一个通用的reg文件。将以下行复制到新的文本文档,并将其另存为anyname.reg。使用您的程序或文档进行编辑。

在路径中,使用\分隔键路径中的文件夹名称,因为regedit使用单个\分隔键名称。所有reg文件均以REGEDIT4开头。分号将一行变成注释。@符号表示将值分配给键,而不是命名值。

该文件不必存在。这可以用于将Word.exe设置为打开Winword.exe。

键入start batchfile将启动iexplore.exe。

REGEDIT4
;The bolded name below is the name of the document or program, <filename>.<file extension> 

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\Batchfile.exe]

;The @ means the path to the file is assigned to the default value for the key.
;The whole path in enclosed in a quotation mark ".

@="\"C:\\Program Files\\Internet Explorer\\iexplore.exe\""

;Optional Parameters. The semicolon means don't process the line. Remove it if you want to put it in the registry

;Informs the shell that the program accepts URLs.

;"useURL"="1"

;Sets the path that a program will use as its' default directory. This is commented out.

;"Path"="C:\\Program Files\\Microsoft Office\\Office\\"

您已经在另一个答案中被告知有关路径的信息。另请参阅doskey /?cmd宏(它们仅在键入时起作用)。

您可以为CMD运行启动命令。来自Windows Recource Kit技术参考

自动运行

HKCU\Software\Microsoft\Command Processor 

Data type Range Default value 
REG_SZ  list of commands  There is no default value for this entry.  

描述

包含每次启动Cmd.exe时执行的命令。



1

如果运行命令cmd,它将更新该命令窗口的所有系统变量。


从某种意义上说。发生的情况是您在当前会话中开始一个新会话。离开将需要您打电话exit两次,首先关闭新的,然后关闭第一个会话(在旧环境中)。

1

使用gtools的路径

它以直观的方式执行操作,例如:

pathed /REMOVE "c:\my\folder"
pathed /APPEND "c:\my\folder"

它并显示结果,而无需生成新的cmd


0
  1. 那时我已经安装了PHP。将php-7 ***。zip解压缩C:\ php \
  2. 备份我当前的PATH环境变量:run cmd,然后执行命令:path >C:\path-backup.txt

  3. 将我当前的路径值获取到C:\ path.txt文件中(相同方式)

  4. 修改path.txt(确保我的路径长度超过1024个字符,Windows运行了几年)
    • 我删除了其中的重复路径,例如'C:\ Windows; C:\ Windows \ System32; C:\ Windows \ System32 \ Wbem; -我有两次。
    • 还要删除卸载的程序路径。示例:C:\ Program Files \ NonExistSoftware;
    • 这样,我的路径字符串长度<1024 :)))
    • 在路径字符串的末尾添加; C:\ php \
    • 路径值复制到带有双引号的缓冲区中!例如:“ C:\ Windows; ****; C:\ php \”没有PATH =应该存在!!!
  5. 以管理员身份打开Windows PowerShell。
  6. 运行命令:

setx path "Here you should insert string from buffer (new path value)"

  1. 重新运行您的终端机(我使用“远距离管理员”)并检查: php -v

0

尽管这很琐碎,但遇到此问题时我不得不重新启动Windows

我正在运行Windows 7 x64。我对系统PATH变量进行了手动更新。如果我从stat菜单运行cmd.exe,这行得通。但是,如果我在Windows资源管理器地址栏中键入“ cmd”,则似乎是从其他位置加载了PATH,而这些更改没有我的手动更改。

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

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.