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

问题描述 投票:2回答:1

通常,可以使用^来在命令行中转义字符。但是我无法使其正常工作。

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

c windows command-line parameter-passing command-line-arguments
1个回答
5
投票

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

您将不会找到关于此的官方消息。您可能希望的最好办法是找到对它进行反编译和反向工程的人员。据我实验所知,shell的解析器一看到换行就无条件停止处理命令行。这也是得出的结论haxe

更新:

为回答您的问题中的更新,我建议您在情况下不要将换行符视为特殊情况。假定将对有问题的API函数进行记录,以将命令传递给Shell而不是直接运行它们,那么程序员不应期望能够传递换行符。当然,您可能希望明确记录事实,这完全是您的要求。 :-)

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

© www.soinside.com 2019 - 2024. All rights reserved.