在 windows 下通过 system() 调用多个命令不起作用

Calling multiple commands via system() under windows doesn't work

所以基本上我正在尝试使用这个:

int main()
    {
    
    system("adb kill-server \n"
                   "adb devices \n"
                   "adb start-server & \n"
                   "var=$(adb shell \"pidof com.rok\")\n"
                   "AFTER=`echo $var | sed 's/\r//g'`\n"
                   "echo \"$AFTER\"\n"
                   "adb shell \"kill -STOP $AFTER\"\n"
                   "adb shell sleep 2\n"
                   "adb shell \"kill -CONT $AFTER\"");
                   
        return 0;
}

这在 Clion 中没有任何错误,但我必须在 visual studio 中执行此操作,在 visual studio 中我不能那样做,我必须单独执行每个系统命令,例如:

        system("adb kill-server");
        system("adb devices");
        system("adb start-server");
        system("var=$(adb shell \"pidof com.rok\")");
        system("AFTER=`echo $var | sed 's/\r//g'`");
        system("adb shell \"kill -STOP $AFTER\"");

所以现在事情是当我 运行 它像这样除了这两行之外一切正常:

        system("var=$(adb shell \"pidof com.rok\")");
        system("AFTER=`echo $var | sed 's/\r//g'`");

尽管它们在 clion 上完美运行,但在 visual studio 中却没有,我找不到解决这个问题的方法,这是错误:

'var' is not recognized as an internal or external command,

可运行的程序或批处理文件。

'AFTER' is not recognized as an internal or external command,

可运行的程序或批处理文件。

谁能解释为什么会这样?我该如何解决这个问题?

system() 的每次调用都会创建它自己的 shell 作为子进程,这就是为什么多个后续 system() 调用不起作用的原因,例如,尝试设置 shell 变量或执行 cd 命令(期望在特定目录中执行后续命令 运行ning)。

最简单的方法是创建一个包含所有命令的小型临时脚本文件,然后通过单个 system() 调用执行此脚本:

// A raw string literal to make escaping easier 
// (see https://en.cppreference.com/w/cpp/language/string_literal)
std::string cmds = R"xxx(
adb kill-server
adb devices
adb start-server & 
var=$(adb shell "pidof com.rok")
AFTER=`echo $var | sed 's/\r//g'`
echo "$AFTER"
adb shell "kill -STOP $AFTER"
adb shell sleep 2
adb shell "kill -CONT $AFTER"
)xxx";

std::ofstream cmdFile("tempCmdFile.cmd");

cmdFile << cmds;
cmdFile.close();

system("tempCmdFile.cmd");

您可能应该在之后整理 tempCmdFile.cmd(即删除它)。但我希望你能理解上面代码的作用。

我也不太确定

AFTER=`echo $var | sed 's/\r//g'`

将在 windows shell 中工作,正如您所期望的那样。您可能需要一个不同的解决方案,或者像 shell 到 运行 这样的 *nix(例如 MinGw 提供了一个)。