【问题标题】:cmd.exe Command Line Parsing of Environment Variablescmd.exe命令行解析环境变量
【发布时间】:2011-01-15 13:38:21
【问题描述】:

我不知道如何让 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

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

【问题讨论】:

    标签: windows command-line cmd


    【解决方案1】:

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

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

    所以从我收集到的这些是转义规则:

    对于 C 运行时/CommandLineToArgvW 标记化

    1. 替换\"\\"
    2. 替换"\"
    3. 用双引号将结果括起来。

    用于cmd.exe解析

    • 转义字符 >|&^ , ", %, ^SPACE 通过添加转义字符 ^
    • 转义空格是不必要的,因为应用了 C 运行时转义规则,并且 cmd.exe 只是将参数传递给另一个程序。

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

    如果写的东西直接被cmd.exe解释,只需要使用cmd.exe的规则;如果以不涉及 cmd.exe 的方式启动程序,则应仅应用 C 运行时规则。

    这是一个由 cmd.exe 直接解释的参数示例,它写入名为 oo %PATH% 的文件:

    echo test > oo^ ^%PATH^%
    

    【讨论】:

    • +1 以获得出色的答案。感谢您发布您的发现。从昨天开始我就一直在关注这个问题,当时我意识到我不知道答案! ;-)
    • 有没有提到“cmd.exe解析”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 2010-09-24
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多