cmd.exe命令行解析环境变量

时间:2011-01-15 13:38:21

标签: windows command-line cmd

我无法想象如何让cmd.exe不将%PATH%这样的内容解释为环境变量。 鉴于此计划:

#include<stdio.h>
#include<windows.h>

int main(int argc, char *argv[])
{
    int i;

    printf("cmd line: %s\n", GetCommandLine());
    for (i = 0; i < argc; i++) {
        printf("%d: %s\n", i, argv[i]);
    }
    return 0;
}

根据参数的位置,我有这些不同的输出:

>args "k\" o" "^%PATH^%"
cmd line: args  "k\" o" "%PATH%"
0: args
1: k" o
2: %PATH%

>args "^%PATH^%" "k\" o"
cmd line: args  "^%PATH^%" "k\" o"
0: args
1: ^%PATH^%
2: k" o

我想这是因为cmd.exe无法识别转义的\"并且看到转义的双引号为关闭第一个,而在第一个案例%PATH%中没有引用。我这样说,因为如果我不引用这个论点,它总是有效:

>args ^%PATH^% "k\" o"
cmd line: args  %PATH% "k\" o"
0: args
1: %PATH%
2: k" o

但是我可以没有空格......

1 个答案:

答案 0 :(得分:4)

这显然可以通过转义引号来实现:

>args ^"oo \\\^" \^" ^%PATH^%^"
cmd line: args  "oo \\\" \" %PATH%"
0: args
1: oo \" " %PATH%

所以从我收集到的这些是逃避规则:

对于C运行时/ CommandLineToArgvW标记化

  1. 替换\"\\"
  2. 替换"\"
  3. 用双引号括起结果。
  4. 对于cmd.exe解析

    • 转义字符&lt; &gt; | &amp; ^ < / kbd>, ^ SPACE 通过添加转义字符 ^
    • 不需要转义空格是应用了C运行时转义规则,而cmd.exe只是将参数传递给另一个程序。

    应按顺序应用这些转换,首先是C运行时规则,然后是cmd.exe规则。

    如果要写入由cmd.exe直接解释的内容,则只应应用cmd.exe规则;如果以不涉及cmd.exe的方式启动程序,则只应应用C运行时规则。

    以下是cmd.exe直接解释的参数示例,该参数写入名为oo %PATH%的文件:

    echo test > oo^ ^%PATH^%