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

Posted

技术标签:

【中文标题】如何通过 Windows 上的 system() 函数将换行符作为参数传递?【英文标题】:How to pass a line break as an argument via the system() function on Windows? 【发布时间】:2016-04-02 04:21:09 【问题描述】:

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

这是一个测试程序,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 是潜在许多程序的基础,我想要它覆盖尽可能多的情况。如果在参数中支持换行符不可行,我将按原样记录。

【问题讨论】:

它应该在没有转义的情况下工作:system("./foo \"arg\narg\""); (添加引号) @Ctx 不,它不起作用,至少在 Windows 上不起作用...... Windows 中的换行符由两个字符组成,试试\r\n。祝你好运。 看起来确实是 XY 问题。你到底想在这里实现什么?什么样的程序需要在它的参数中换行呢? 如果 Harry 说的是真的,那么你可能不会得到一个强大的解决方案,但是开发你自己的编码是否可以接受?假设使用 ','(逗号)作为转义字符,这样 ',n' 表示换行符,而 ',,' 将是文字逗号。 【参考方案1】:

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

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

更新:

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

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

【讨论】:

以上是关于如何通过 Windows 上的 system() 函数将换行符作为参数传递?的主要内容,如果未能解决你的问题,请参考以下文章

c#windows窗体程序中如何写程序删除窗体上的多余的textbox文本框

在 `System.Windows.Forms` 控件中没有 `ref` 关键字的情况下,如何通过引用传递

如何通过 windows SYSTEM 自动启动 django web 服务器

csharp Windows,Linux和mac osx上的System.Environment.OSVersion

如何在 Linux 上的 X Window System 中找到一个窗口并将其置于最前面?

在 Windows Server 2012 上的 .NET 4.0 上运行服务构建时出现 System.Configuration.ConfigurationException