繁体   English   中英

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

[英]cmd.exe Command Line Parsing of Environment Variables

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

但那时我不能有空格...

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

>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^%

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM