如何通过Windows上的system()函数将换行符作为parameter passing?

通常可以使用^命令行中转义字符。 但是我无法做到这一点。

这是一个testing程序,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命令,这在使用CreateProcess时是不可用的。

更新:

问的原因是我正在实现一种编程语言( haxe )的API。 API允许用户将任意命令传递给shell。 我希望人们不需要在任何论点中使用换行符,但是谁知道……无论如何,因为编程语言的API是潜在的大量程序的基础,我希望它覆盖尽可能多的例子。 如果在论证中支持换行是不可行的,我会按原样logging。

Solutions Collecting From Web of "如何通过Windows上的system()函数将换行符作为parameter passing?"

好的,所以我已经做了一些测试,并且在使用CreateProcess的时候它可以工作。 这告诉我们C运行库的命令行解析器没有对换行进行任何操作,这意味着问题必须与cmd.exe (“shell”)解析命令行的方式有关。

你不会找到官方的消息来源。 你所希望的最好的方法是找到反编译和反编译的人。 据我所知,通过实验,shell的解析器无条件停止处理命令行,只要它看到一个换行。 这也是在这个答案中得出的结论。

最好的办法就是搜索字符串中的换行符,如果找到,使用CreateProcess而不是system()。 为了获得更大的一致性,在任何情况下都使用CreateProcess,但是(为了支持内置的shell命令),如果没有换行,则通过shell传递命令:

 <insert-value-of-comspec-here> /s /c "<insert-command-string-here>" 

更新:

为了回应您的问题中的更新,我会在您的情况下建议您不要将换行符当作特殊情况。 假设有问题的API函数将被记录为将命令传递给shell而不是直接运行它们,程序员不应该期望能够传递行提要。 当然,您可能更愿意明确记录事实,这完全是您的呼叫。 🙂

我建议你提供一些方法来直接运行一个命令,而不是通过shell,因为有边缘情况下通过shell进行操作是不方便的。 这可能是一个不同的功能或选项。