使用批处理文件设置Windows环境变量

81

我正在寻找一种使用.cmd文件设置环境路径变量的方法。
当路径变量过长时,我会遇到一些错误。
只需将所需的变量添加到下面的“设置路径变量”中
检查您的路径变量的当前值并将其添加到脚本中
以管理员身份运行脚本!
打开一个新的控制台窗口,它应该能正常工作,例如php-v


19
我不太明白这个主题的目的。这个“问题”根本不是一个问题,它既没有描述问题也没有说明期望的结果,反而包含了“部分答案”!另一方面,下面的回答似乎与“问题”毫无关系,因此其实用性有限。同一个人发布了两部分内容并不是绕过论坛主题的问题/答案格式的借口...请注意,同一个人发布两部分内容不是绕过论坛主题/答案格式的借口。 - Aacini
4
这只是我一直在寻找的东西,但没有找到一个合适的答案,我花了很长时间才制作出来,所以我将其添加为社区维基,以便其他人可以使用。我应该把它删除吗? - Ruben
2
不用担心,只需使用此工具:http://www.rapidee.com/en/about - Ruben
3个回答

114
@ECHO OFF

:: %HOMEDRIVE% = C:
:: %HOMEPATH% = \Users\Ruben
:: %system32% ??
:: No spaces in paths
:: Program Files > ProgramFiles
:: cls = clear screen
:: CMD reads the system environment variables when it starts. To re-read those variables you need to restart CMD
:: Use console 2 http://sourceforge.net/projects/console/


:: Assign all Path variables
SET PHP="%HOMEDRIVE%\wamp\bin\php\php5.4.16"
SET SYSTEM32=";%HOMEDRIVE%\Windows\System32"
SET ANT=";%HOMEDRIVE%%HOMEPATH%\Downloads\apache-ant-1.9.0-bin\apache-ant-1.9.0\bin"
SET GRADLE=";%HOMEDRIVE%\tools\gradle-1.6\bin;"
SET ADT=";%HOMEDRIVE%\tools\adt-bundle-windows-x86-20130219\eclipse\jre\bin"
SET ADTTOOLS=";%HOMEDRIVE%\tools\adt-bundle-windows-x86-20130219\sdk\tools"
SET ADTP=";%HOMEDRIVE%\tools\adt-bundle-windows-x86-20130219\sdk\platform-tools"
SET YII=";%HOMEDRIVE%\wamp\www\yii\framework"
SET NODEJS=";%HOMEDRIVE%\ProgramFiles\nodejs"
SET CURL=";%HOMEDRIVE%\tools\curl_734_0_ssl"
SET COMPOSER=";%HOMEDRIVE%\ProgramData\ComposerSetup\bin"
SET GIT=";%HOMEDRIVE%\Program Files\Git\cmd"

:: Set Path variable
setx PATH "%PHP%%SYSTEM32%%NODEJS%%COMPOSER%%YII%%GIT%" /m

:: Set Java variable
setx JAVA_HOME "%HOMEDRIVE%\ProgramFiles\Java\jdk1.7.0_21" /m

PAUSE

6
太棒了!我散布在Windows变量和Emacs变量中的路径收集需要整理一下,我会尝试这个方法。非常有教育意义,谢谢! - Brady Trainor
谢谢,这正是我要找的。我想问一下,为什么JAVA_HOME设置为setx而不是像以前的路径变量一样设置为SET?谢谢。 - rchrd
2
@rchrd SET 在控制台中初始化一个变量,而 setx 则实际上在 Windows 环境变量中设置变量。你可以只在 setx PATH 中设置字符串,但那样会使它难以阅读,并且字符串可能会变得非常长,导致出现错误。 - Ruben
1
这里有一个小但非常重要的提示:值周围的引号是可选的。它们实际上被包含在环境变量中!我发现这一点是因为我在log4j中使用了一个路径的env变量,并在其后附加了一个子文件夹。这导致崩溃,因为结果类似于:"C:/mylogfolder"/appended_subfolder - 这会导致log4j崩溃(可以理解)。 - wlfbck

5

我从Linux的角度来看待这个问题。通常在Linux中设置一个环境变量($myVar=1),只会为当前进程设置,而不包括它生成的任何子进程。

为了使任何子进程都能读取变量,您需要使用export envVar=2命令。在Windows中,set命令已经为您执行此操作。 这通常是您想要的结果。

setx命令可以永久地为当前用户设置变量,但奇怪的是这并没有反应在当前进程中,您需要打开另一个cmd.exe窗口才能生效。

C:\> set foobar=1

C:\> powershell "echo ${env:foobar}"
1

C:\> setx barfoo 2

SUCCESS: Specified value was saved.

C:\> powershell "echo ${env:barfoo}"  # not present

C:\> 

此外,请注意setsetx之间必需的语法差异。


0
请注意,使用setxreg add将覆盖变量的现有值。如果您在重要的系统变量上进行测试,请确保备份数据。
您需要先读取变量数据,然后将其与新值连接起来以追加数据。以下示例将在当前用户环境中将Python路径附加到Path变量中:
@echo off
set sMyPath=E:\python-3.8.8;E:\python-3.8.8\Scripts

for /f "tokens=3" %%a in ('reg query "HKCU\Environment" /v Path') do set OLD_DATA=%%a
reg add "HKCU\Environment" /v Path /d "%OLD_DATA%;%sMyPath%;" /f
pause
exit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接