V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
banixc
V2EX  ›  Windows

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

  •  
  •   banixc · 2016-11-24 23:47:59 +08:00 · 2216 次点击
    这是一个创建于 2923 天前的主题,其中的信息可能已经有所发展或是发生改变。

    众所周知 如果系统中存在一个环境变量: XXX=AAABBB\CCC %XXX%\ABC可以转义为AAABBB\CCC\ABC 这个操作是递归的: YYY=%XXX%\ABC 那么实际上%YYY%\CBA这个环境变量应该是AAABBB\CCC\ABC\CBA 然而当我设置了如下的一堆变量之后 PATH 在 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% 在前面就被转义了?

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

    更正一下, 是 批处理第一行是 @echo off 。不是 @echo
    banixc
        5
    banixc  
    OP
       2016-12-07 20:44:50 +08:00
    @forcecharlie 多谢,我平时喜欢在某个文件夹 shift+右键开 cmd 。。。
    这两天闲的时候又试了好多次,然后终于解决了这个问题:
    把除了 MY_PATH 之外的所有变量均移动至系统变量就可以了。
    猜测确实是因为层级的问题, Windwos 生成的环境变量是有顺序的。比如 MY_PATH 和 NGINX_HOME/PHP_HOME 都在系统级别的环境变量中就不会成功转义。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3586 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:09 · PVG 08:09 · LAX 16:09 · JFK 19:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.