我无法想象如何让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
但是我可以没有空格......
答案 0 :(得分:4)
这显然可以通过转义引号来实现:
>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^%