如何通过 Windows 上的 system() 函数将换行符作为参数传递?

How to pass a line break as an argument via the system() function on Windows?

通常可以使用^ 来转义命令行中的字符。但是我无法让它工作。

这是一个测试程序,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...
}

LineBreak的输出CommandArguments.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 function, since I want the ability to use shell commands like dir/cd, which are not available when using CreateProcess

更新:

问的原因是我正在为一种编程语言(haxe)实现一个API。 API 允许用户向 shell 传递任意命令。我 希望 人们不需要在任何论证中使用换行符,但谁知道呢......无论如何,因为编程语言的 api 是潜在的基础很多程序,我希望它涵盖尽可能多的案例。如果在参数中支持换行不可行,我将按原样记录。

好的,我已经做了一些测试,当您使用 CreateProcess 时它确实有效。这告诉我们 C 运行time 的命令行解析器没有对换行做任何事情,这意味着问题一定与 cmd.exe ("the shell") 解析命令行的方式有关。

你不会找到官方消息来源。您最好的希望是找到反编译的人并 reverse-engineered 它。据我的实验所知,shell 的解析器一看到换行符就无条件地停止处理命令行。这也是得出的结论in this answer.

更新:

针对您问题的更新,我建议您不要将换行符视为特例。假设所讨论的 API 函数将被记录为将命令传递给 shell 而不是直接 运行ning 它们,程序员不应期望能够传递换行符。当然,您可能更愿意明确记录事实,这完全由您决定。 :-)

我确实建议您直接向 运行 命令提供 some 方法,而不是通过 shell,因为在某些情况下会通过shell 很不方便。这可能是不同的功能或选项。