通常可以使用^
来转义命令行中的字符。但我无法让它发挥作用。
这是一个测试程序,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");
}
}
有问题的程序LineBreakCommandArguments.exe如下:
void main(void)
{
system("CommandArguments ^\n"); // ^\n does not really pass a line break...
}
LineBreakCommandArguments.exe的输出:
>LineBreakCommandArguments.exe
0: CommandArguments
67 111 109 109 97 110 100 65 114 103 117 109 101 110 116 115
如上所示,CommandArguments只有一个参数。缺少换行符。
所以问题是,我应该如何修改LineBreakCommandArguments,以便CommandArguments将换行符作为参数?
请注意,我仍然希望使用system
函数,因为我希望能够使用dir
/ cd
之类的shell命令,这些命令在使用时不可用{{3 }}
更新
问的原因是我正在为编程语言(CreateProcess
)实现API。 API允许用户将任意命令传递给shell。我希望人们不需要在任何参数中使用换行符,但谁知道......无论如何,因为编程语言的api是潜在的大量程序的基础,我希望它涵盖尽可能多的案例。如果在参数中支持换行符不可行,我将按原样记录。
答案 0 :(得分:4)
好的,所以我做了一些测试,当你使用CreateProcess时它确实有效。这告诉我们C运行时的命令行解析器没有对换行做任何事情,这意味着问题必须与cmd.exe
的方式有关(&#34; shell&#34; )解析命令行。
你不会在那找到官方消息来源。你能想到的最好的事情就是找到一个经过反编译并对其进行逆向工程的人。据我所知,shell的解析器一看到换行符就会无条件地停止处理命令行。这也是达到in this answer的结论。
您最好的选择是在字符串中搜索换行符,如果找到换行符,则使用CreateProcess而不是system()。为了更好的一致性,在任何一种情况下都使用CreateProcess,但是(为了支持内置的shell命令)如果没有换行符,则通过shell传递命令:
<insert-value-of-comspec-here> /s /c "<insert-command-string-here>"
更新
为了回答您问题中的更新,我建议您在自己的方案中不要将换行视为一种特殊情况。假设有问题的API函数将被记录为将命令传递给shell而不是直接运行它们,程序员不应该期望能够传递换行符。当然,您可能更愿意明确记录这一事实,完全是您的电话。 : - )
我建议您提供某些方法来直接运行命令而不是通过shell运行命令,因为存在通过shell进行操作的边缘情况不方便。这可能是一个不同的功能或选项。