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

标签 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");
    }
}

相关程序 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 时不可用.

更新:

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

最佳答案

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

你不会找到这方面的官方消息来源。您最好的希望就是找到对其进行反编译和逆向工程的人。据我通过实验得知,shell 的解析器一旦看到换行符就会无条件地停止处理命令行。这也是得出的结论in this answer .

更新:

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

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

关于c - 如何通过 Windows 上的 system() 函数将换行符作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34491463/

相关文章:

c# - 使用 C# 从特定目录中删除文件应该使用哪个库?

c++ - 如何更改静态名称参数中的文件甚至数组的名称?

CS50 Speller 可以编译,但根本无法运行

c - 多线程程序 : waiting on input

c - 预期的标识符什么的?

linux - 具有 `sort -n -u -k` 和 `uniq -c` 组合行为的命令

c - 如何在 x 和 y 轴上创建小行星

c++ - 无法注册 hwnd 窗口

windows - IBM API 的 Python 多处理错误(Q Experience)

php - 如何使用 exec() PHP 发送变量