通常,可以使用^
来在命令行中转义字符。但是我无法使其正常工作。
这里是一个测试程序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
函数,因为我希望能够使用shell命令,例如system
/ dir
,这些命令在使用cd
时不可用。
更新:
问的原因是我正在为一种编程语言(CreateProcess
)实现API。该API允许用户将任意命令传递给Shell。我希望人们不需要在任何参数中使用换行符,但是谁知道...总之,由于编程语言的api是潜在许多程序的基础,我希望它涵盖尽可能多的情况。如果在参数中支持换行不可行,我将按原样记录它。
[确定,所以我已经做了一些测试,当您使用CreateProcess时它确实可以工作。这告诉我们C运行时的命令行解析器对换行没有执行任何操作,这意味着问题必须与CreateProcess
(“ shell”)解析命令行的方式有关。
您将不会找到关于此的官方消息。您可能希望的最好办法是找到对它进行反编译和反向工程的人员。据我实验所知,shell的解析器一看到换行就无条件停止处理命令行。这也是得出的结论haxe。
更新:
为回答您的问题中的更新,我建议您在情况下不要将换行符视为特殊情况。假定将对有问题的API函数进行记录,以将命令传递给Shell而不是直接运行它们,那么程序员不应期望能够传递换行符。当然,您可能希望明确记录事实,这完全是您的要求。 :-)
我确实建议您提供some方法来直接运行命令而不是通过外壳程序,因为在某些情况下,通过外壳程序不方便。这可能是一个不同的功能或一个选项。