众所周知
如果系统中存在一个环境变量:
XXX=AAABBB\CCC
%XXX%\ABC
可以转义为AAABBB\CCC\ABC
这个操作是递归的:
YYY=%XXX%\ABC
那么实际上%YYY%\CBA
这个环境变量应该是AAABBB\CCC\ABC\CBA
然而当我设置了如下的一堆变量之后
在 CMD 中输入 SET 查看环境变量时却发现一个很蹊跷的问题
ANDROID_HOME=D:\Shell\Android-SDK
ARIA2_HOME=D:\Shell\aria2
CLASSPATH=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
GIT_HOME=D:\Shell\Git\Git-2.10.2
GOPATH=D:\Shell\Go\GoPath
GO_HOME=D:\Shell\Go\go1.7.3
HTTPD_HOME=D:\Shell\Apache\Apache24
JAVA_HOME=D:\Shell\Java\jdk1.8.0_112
MINGW_HOME=D:\Shell\MinGW
MYSQL_HOME=D:\Shell\MySQL\mysql-5.7.16-winx64
MY_PATH=D:\Shell\Binary;D:\Shell\Android-SDK\platform-tools;D:\Shell\Apache\Apache24\bin;D:\Shell\Git\Git-2.10.2\bin;D:\Shell\Git\Git-2.10.2\cmd;D:\Shell\Git\Git-2.10.2\usr\bin;D:\Shell\MinGW\bin;D:\Shell\MinGW\msys\1.0\bin;%NGINX_HOME%;%PHP_HOME%;D:\Shell\aria2;
NGINX_HOME=D:\Shell\nginx\nginx-1.11.5
Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\nodejs\;C:\Users\Banixc\AppData\Local\Programs\Python\Python35-32\Scripts\;C:\Users\Banixc\AppData\Local\Programs\Python\Python35-32\;C:\Users\Banixc\AppData\Local\Microsoft\WindowsApps;C:\Users\Banixc\AppData\Roaming\npm;D:\Softwares\crass-0.4.14.0;D:\Shell\Binary;D:\Shell\Android-SDK\platform-tools;D:\Shell\Apache\Apache24\bin;D:\Shell\Git\Git-2.10.2\bin;D:\Shell\Git\Git-2.10.2\cmd;D:\Shell\Git\Git-2.10.2\usr\bin;D:\Shell\MinGW\bin;D:\Shell\MinGW\msys\1.0\bin;%NGINX_HOME%;%PHP_HOME%;D:\Shell\aria2;
PHP_HOME=D:\Shell\php\php7.0.13-Win32-VC14-x64
SHELL_HOME=D:\Shell
其中 MY_PATH 和 Path 包含了%NGINX_HOME%;%PHP_HOME%这两项
为什么这两项没有被转义?
如果说是顺序的问题,那么为什么%SHELL_HOME% 在前面就被转义了?
1
forcecharlie 2016-11-25 14:15:50 +08:00
你设置的顺序改一下,把 NGINX_HOME 和 PHP_HOME 移到 MY_PATH 前面,环境变量解析还是有顺序的。
|
2
banixc OP @forcecharlie 这不是我能控制的。
在设置里添加了环境变量后顺序会自动按首字母调整。 |
3
forcecharlie 2016-11-25 16:43:44 +08:00
@banixc 你可以用一个批处理文件,批处理中按顺序解析的,系统配置中的一般需要用绝对路径。
```bat @echo set NGINX_HOME=D:\Shell\nginx\nginx-1.11.5 set MY_PATH=D:\Shell\Binary;D:\Shell\Android-SDK\platform-tools;D:\Shell\Apache\Apache24\bin;D:\Shell\Git\Git-2.10.2\bin;D:\Shell\Git\Git-2.10.2\cmd;D:\Shell\Git\Git-2.10.2\usr\bin;D:\Shell\MinGW\bin;D:\Shell\MinGW\msys\1.0\bin;%NGINX_HOME%;%PHP_HOME%;D:\Shell\aria2; set PATH=%PATH%;%MY_PATH% cmd /k ``` 如果你要启动其他程序,可以把对应的命令替换 cmd /k 即可。 |
4
forcecharlie 2016-11-25 16:46:17 +08:00
|
5
banixc OP @forcecharlie 多谢,我平时喜欢在某个文件夹 shift+右键开 cmd 。。。
这两天闲的时候又试了好多次,然后终于解决了这个问题: 把除了 MY_PATH 之外的所有变量均移动至系统变量就可以了。 猜测确实是因为层级的问题, Windwos 生成的环境变量是有顺序的。比如 MY_PATH 和 NGINX_HOME/PHP_HOME 都在系统级别的环境变量中就不会成功转义。 |