您如何使用System()调用带有引号的参数的批处理文件

How do you call a batch file with an argument that has quotes, using system()

本文关键字:参数 批处理文件 调用 何使用 System      更新时间:2023-10-16

例如,在命令行中,该作品(第一个参数具有引号,但第二个参数没有):" test.bat" a" a" b即它知道" A"是第一个参数,B是第二个参数

但是使用System()它不起作用: system("test.bat" "a" b)

这也行不通: system("test.bat" "a" b)

,如果我们使用原始字符串文字,这将是最简单的。原始的字符串字面是在C 中编写字符串的一种方式,没有任何东西可以逃脱。让我们看一个例子:

char const* myCommand = R"(test.bat "a" b)"; 

开始时的R表示它是一个原始字符串字面的,如果您调用system(myCommand),它将完全等同于键入

$ test.bat "a" b

进入命令行。现在,假设您想逃脱命令行上的引号:

$ test.bat "a" b

使用原始字符串字面的,这很简单:

char const* myCommand = R"(test.bat "a" b)"; 
system(myCommand); 

或,或者,

system(R"(test.bat "a" b)"); 

希望这会有所帮助!

有关原始字符串文字的更多信息:原始字符串文字是一个很棒的功能,它们基本上允许您将任何文本直接复制到您的程序中。它们从R开始,然后是报价和括号。括号中只有包含的东西。示例:

using std::string; 
string a = R"(Hello)";        // a == "Hello"

以"原始"开头和结尾:

string b = R"raw(Hello)raw";  // b == "Hello"

以" foo"开头和结尾

string c = R"foo(Hello)foo";  // c == "Hello"

以" x"

开始和结尾
string d = R"x(Hello)x";      // d == "Hello"

重要的是,我们以相同的字母字符串(称为定界符)开始并结束文字,然后是括号。这样可以确保我们永远没有理由逃避原始字符串字面的东西,因为我们可以随时更改定界符,因此它在字符串中找不到。

我现在开始工作:

system(R"(C:"to erasetest.bat" "a")");

我找到了答案: system("test.bat" ""a"" b);

或更精确:system(""test.bat" ""a"" b");

因此,答案是用双引号逃脱报价