[英]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%
因此,根据我的收集,这些是转义规则:
CommandLineToArgvW
令牌化 \\"
→ \\\\"
"
→ \\"
这些转换应按顺序应用,首先是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.