And*_* Li 2 c windows command-line parameter-passing command-line-arguments
通常可以用来^在命令行中转义字符。但我无法让它工作。
这是一个测试程序,CommandArguments.exe,它打印它得到的参数。
int main(int argc, char *argv[])
{
int i, j;
for (i = 0; i < argc; ++i) {
printf("%d: %s\n", i, argv[i]);
for (j = 0; j < strlen(argv[i]); ++j) {
printf(" ");
printf("%d ", argv[i][j]);
}
printf("\n");
}
}
Run Code Online (Sandbox Code Playgroud)
有问题的程序 LineBreakCommandArguments.exe 如下所示:
void main(void)
{
system("CommandArguments ^\n"); // ^\n does not really pass a line break...
}
Run Code Online (Sandbox Code Playgroud)
LineBreakCommandArguments.exe 的输出:
>LineBreakCommandArguments.exe
0: CommandArguments
67 111 109 109 97 110 100 65 114 103 117 109 101 110 116 115
Run Code Online (Sandbox Code Playgroud)
如上所示,CommandArguments 只有一个参数。缺少换行符。
所以问题是,我应该如何修改 LineBreakCommandArguments,以便 CommandArguments 将换行符作为参数?
请注意,我仍然想使用该system函数,因为我希望能够使用dir/等 shell 命令cd,而使用CreateProcess.
更新:
问的原因是我正在为编程语言(haxe)实现一个 API 。该 API 允许用户向 shell 传递任意命令。我希望人们不需要在任何参数中使用换行符,但谁知道呢……无论如何,由于编程语言的 api 是潜在许多程序的基础,我希望它涵盖尽可能多的情况. 如果在参数中支持换行不可行,我将按原样记录下来。
好的,所以我做了一些测试,当你使用 CreateProcess 时它确实有效。这告诉我们 C 运行时的命令行解析器没有对换行执行任何操作,这意味着问题必须与cmd.exe(“shell”)解析命令行的方式有关。
你不会找到官方消息来源。最好的办法就是找到一个反编译和逆向工程的人。据我通过实验得知,shell 的解析器一旦看到换行符就会无条件地停止处理命令行。这也是本回答得出的结论。
更新:
针对您问题中的更新,我建议您在您的场景中不要将换行符视为特殊情况。假设有问题的 API 函数将被记录为将命令传递给 shell 而不是直接运行它们,程序员不应该期望能够传递换行符。当然,您可能更愿意明确记录事实,这完全是您的要求。:-)
我确实建议您提供一些方法来直接运行命令而不是通过 shell,因为在某些边缘情况下,通过 shell 运行不方便。这可能是不同的功能或选项。