关于 Windows 的环境变量转义问题

2016-11-24 23:47:59 +08:00
 banixc

众所周知 如果系统中存在一个环境变量: 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% 在前面就被转义了?

2225 次点击
所在节点    Windows
5 条回复
forcecharlie
2016-11-25 14:15:50 +08:00
你设置的顺序改一下,把 NGINX_HOME 和 PHP_HOME 移到 MY_PATH 前面,环境变量解析还是有顺序的。
banixc
2016-11-25 15:56:39 +08:00
@forcecharlie 这不是我能控制的。
在设置里添加了环境变量后顺序会自动按首字母调整。
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 即可。
forcecharlie
2016-11-25 16:46:17 +08:00
@banixc

更正一下, 是 批处理第一行是 @echo off 。不是 @echo
banixc
2016-12-07 20:44:50 +08:00
@forcecharlie 多谢,我平时喜欢在某个文件夹 shift+右键开 cmd 。。。
这两天闲的时候又试了好多次,然后终于解决了这个问题:
把除了 MY_PATH 之外的所有变量均移动至系统变量就可以了。
猜测确实是因为层级的问题, Windwos 生成的环境变量是有顺序的。比如 MY_PATH 和 NGINX_HOME/PHP_HOME 都在系统级别的环境变量中就不会成功转义。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/323112

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX