ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在尝试在 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 上开发并且您从未需要修改 PATH,我会感到惊讶。为了满足与编程相关的愿望,我强调了投票率最高的答案所指出的内容:您可以通过控制台(或通过批处理文件)以编程方式执行此操作。
感谢@GeorgeStocker 的评论,是的,我以编程方式完成了它,但我只是不知道在控制台会话中应用更改后我需要重新登录。 (我认为仅在我的情况下)但投票最高的答案通常回答了这个问题
@George - 同意,但就目前而言,这个问题是为超级用户编写的,而不是 Stack Overflow。超级用户将提供个人使用的网络服务器配置帮助。 Stack Overflow 用于编程问题。
退出并打开一个新控制台...如果您使用的是 bash,则可能需要在更改持续存在之前重新启动系统,具体取决于您使用的方式/内容。

s
srm

选项1

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

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

选项 2

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

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。


@Ilya:我的意思是让您在 MyComputer->Properties->Advanced->Env Variables->Path 中更改路径后打开控制台窗口。有些 Windows 应用程序在启动后会传播环境变量更改,有些则不会。 WinXP cmd.exe 没有。
如果我退出控制台并重新运行,我必须重置路径。知道如何使这种更改永久化吗?
@David天宇Wong 如果你按照“我的电脑”>“属性”>“高级”>“环境变量”>“路径”。并将目录添加到该字符串的末尾,它将保留。请务必在进行更改后打开控制台。
@David天宇Wong 刚刚发现“SETX 是一种进行持久更改的方法,就像对话框一样。”所以 SETX 命令应该这样做
如果您添加注释选项 2 是会话范围的,而不是系统范围的,那就更好了。
S
StayOnTarget

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

您可以使用 setx 命令永久添加到 PATH 的路径:

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

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

笔记:

setx 命令仅在 Windows 7 及更高版本中可用。

您应该从提升的命令提示符运行此命令。

如果您只想为当前会话更改它,请使用 set。


SETX /M path "%path%;C:\Program Files (x86)\Git\bin\" 在机器级别设置 PATH 值
为什么这不是公认的答案?我想大多数人都想永久地设定他们的道路......
警告:由于使用了 %PATH% 变量,此命令将全局环境变量与用户变量合并。不是吗?这可能会产生不必要的副作用,尤其是使用 /M 开关
警告 2: %PATH% 变量可能与环境变量不同步,因为它是在命令提示符启动时加载的,之后再也不会重新加载(即使在执行 setx 命令时)。它也可能已被先前执行的脚本在本地更改。
P
Peter Mortensen

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

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


嗯,不,它真的只是修改了注册表。在控制面板对话框中执行此操作而不是在命令提示符下使用 PATH 命令应该会有点明显。如果您关心的话,您可以使用 SysInternals 的 Process Monitor 轻松观察它的作用。使用 PATH 不一样,您所做的任何更改都会在控制台关闭时丢失。 SETX 是一种进行持久更改的方法,例如对话框。
这是对的。在获取新的环境变量之前,您始终必须重新启动控制台会话。
如果从应用程序发送 WM_SETTINGCHANGE 消息,控制台会话会更新变量吗? stackoverflow.com/a/8358361
从理论上讲是可能的,我所知道的实际 CRT 实现实际上没有这样做。资源管理器可以。
P
Peter Mortensen

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

PATH

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

PATH %PATH%;C:\xampp\php

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

PATH ;

更新

就像 Danial Wilson 在下面的评论中指出的那样,它仅在当前会话中设置路径。要永久设置路径,请使用 setx,但请注意,虽然这会永久设置路径,但 不是 在当前会话中,因此您必须启动新的命令行才能看到更改。更多信息是 here

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

echo %YOUR_ENV_VARIABLE%

它起作用了:) 那怎么样! '路径%PATH%;'我记得
我认为这仅适用于 cmd 会话的实例,使用 setx 永久更改它
不要包含引号。例如调用 PATH %PATH%;C:\Program Files\... 而不是 PATH "%PATH%;C:\Program Files\..."
不要使用 setx!您冒着截断路径变量的风险,丢失了许多您花费时间设置的其他路径。注意上面的警告。
@STWilson,太晚了,看不到你的评论!
M
Mariano Desanze

我会改用 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 确认您的目录确实存在。


要使用 Machine 参数调用 SetEnvironmentVariable,您需要以管理员权限打开 PowerShell
令人非常失望的是,这个“power” shell 无法识别 %userprofile% 和 $userprofile.. 但话又说回来,这是我们正在谈论的窗口
@abbood 您要查找的是 $env:userprofile
您还应该在 GetEnvironmentVariable 的调用中指定 usermachine。否则,$PATH 将包含注册表的用户和机器部分的值,这将在再次存储路径变量时不必要地破坏路径变量。
D
Dave Jarvis

更安全的 SETX

@Nafscript's initial SETX answer 上的所有评论表示赞同。

SETX 默认会更新你的用户路径。

SETX ... /M 将更新您的系统路径。

%PATH% 包含附加用户路径的系统路径

警告

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

ss64 SETX page 有一些很好的例子。重要的是,它指出了 SETXSETX /M 的注册表项的位置

用户变量:HKCU\Environment 系统变量:HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

使用说明

附加到用户路径

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必须以管理员身份运行。

(除了 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 的改进版本,它拆分了设置用户或系统环境变量。

例子

这是在 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. 不完全正确


P
Peter Mortensen

如果您已经在要添加到 PATH 的目录中,则非常方便:

set PATH=%PATH%;%CD%

它适用于标准的 Windows cmd,但不适用于 PowerShell。

对于 PowerShell,%CD% 等效项是 [System.Environment]::CurrentDirectory


我的 Powershell 说 %CD% 无法识别。
@PauloMatos 可以尝试使用 [System.Environment]::CurrentDirectory
P
Peter Mortensen

除了所有答案之外,如果您想要一个不错的 GUI 工具来编辑您的 Windows 环境变量,您可以使用 Rapid Environment Editor

试试看!它使用安全,非常棒!


Windows 10 现在显着改进了路径环境变量编辑器。他们只花了 20 年的时间来解决这个问题。
P
Peter Mortensen

命令行更改不会是永久性的,并且会在控制台关闭时丢失。

该路径的工作方式类似于先到先得。

您可能想要覆盖其他已包含的可执行文件。例如,如果您的路径上已经有另一个版本,并且您想添加不同的版本而不对路径进行永久更改,您应该将目录放在命令的开头。

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

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


P
Peter Mortensen

使用来自 gtoolspathed

它以直观的方式做事。例如:

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

它无需生成新的 cmd 即可显示结果!


gtools 可以使用例如带有 oneliner 的 scoop 轻松安装:scoop install gtools 以防万一这对其他人有用
G
Grzegorz Gajos

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

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

这是 *nix-es 和 Windows 之间的一个重要区别。批处理在同一个 shell 中运行,并且在它退出后(在会话范围内)对环境的更改仍然存在。但是,这有两种方式:批处理文件可以消除您的环境。 (顺便说一句,在 *nix-es 上,您只需要 source 这样的文件,例如 . mybatchfile)。
嗨@grzegorz-gajos,我正在寻找那个,你的更多细节链接给出了404。还有其他选择吗?
抱歉,链接中的内容不再可用。我删除了。
P
Peter Mortensen

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

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

最适合我的 SETX 语法用法:

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

应避免使用任何等号“=”,而且您不必担心空格!不需要为其中包含空格的路径插入任何引号 - 拆分符号';'做这项工作。

SETX 后面的 PATH 关键字定义了应该在系统环境变量的可能值中更改哪一组值,引号内的 %PATH%(由百分号包围的单词 PATH)告诉操作系统保留现有的PATH 值,并将以下路径(拆分符号“;”之后的路径)添加到现有值。


当我尝试它时,这没有任何作用。你错过了一个等号吗?
S
Surendra Parchuru

以下解决方案完美运行

在您的 Windows 终端中尝试以下命令。

C:>setx PATH "C:\myfolder;%PATH%"

成功:指定的值已保存。

您可以在 Here 上参考更多信息


P
Pranav Sharma

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


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

在命令提示符中,您告诉 Cmd 使用 Windows Explorer's 命令行,方法是在它前面加上 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 资源工具包技术参考

自动运行

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 时执行的命令。


P
Peter Mortensen

控制面板的更好替代方法是使用 SourceForge 的这个名为 Pathenator 的免费软件程序。

但是,它仅适用于具有 .NET 4.0 或更高版本的系统,例如 Windows 7Windows 8Windows 10


O
Oliver Baumann

我当时已经安装了 PHP。将 php-7***.zip 解压到 C:\php\ 备份我当前的 PATH 环境变量:运行 cmd,并执行命令:path >C:\path-backup.txt 获取我当前的路径值到 C:\path。 txt 文件(相同方式) 修改 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= !!!以管理员身份打开 Windows PowerShell。运行命令:

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

重新运行您的终端(我使用“Far manager”)并检查: php -v


P
Peter Mortensen

尽管可能微不足道,但在遇到此问题时,我不得不重新启动 Windows。

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

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


有解释吗?
我不知道这背后的技术性,但 Windows 只是臭名昭著,总是先重新启动,然后才继续排除故障......
J
Janin

在 Windows 10 上,我能够搜索设置路径环境变量并获得以下说明:

在桌面上,右键单击屏幕的最左下角以获取高级用户任务菜单。从高级用户任务菜单中,单击系统。在“设置”窗口中,向下滚动到“相关设置”部分,然后单击“系统信息”链接。在“系统”窗口中,单击左侧导航面板中的“高级系统设置”链接。在“系统属性”窗口中,单击“高级”选项卡,然后单击该选项卡底部附近的“环境变量”按钮。在 Environment Variables 窗口(如下图所示)中,突出显示 System variables 部分中的 Path 变量,然后单击 Edit 按钮。使用您希望计算机访问的路径添加或修改路径行。每个不同的目录用分号隔开,如下图:

C:\Program 文件;C:\Winnt;C:\Winnt\System32

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


k
kiriloff

在 Windows 上的 bash shell 中使用这些命令将新位置附加到 PATH 变量

PATH=$PATH:/path/to/mydir

或添加此位置

PATH=/path/to/mydir:$PATH

例如在你的情况下

PATH=$PATH:C:\xampp\php

您可以回显 $PATH 以查看 shell 中的 PATH 变量


c
cachius

如何从 cmd.exe/Run... 对话框打开环境变量窗口

SystemPropertiesAdvanced并点击“环境变量”,没有UAC

rundll32 sysdm.cpl,EditEnvironmentVariables direct,可能触发 UAC

通过 serverfault.com 上的 Can the environment variables tool in windows be launched directly?

如何从资源管理器中打开环境变量窗口

右键单击“这台电脑” 单击“属性” 在弹出的窗口左侧面板上,单击“高级系统设置” 单击“高级”选项卡 单击窗口底部的“环境变量”按钮

您也可以在开始菜单搜索中搜索 Variables

参考图像“环境变量”窗口的外观:

视窗 10

https://i.stack.imgur.com/7IWua.png

Windows 7的

https://i.stack.imgur.com/hLV0J.png

视窗

https://i.stack.imgur.com/hFL7N.png