在Windows下通过system调用多个命令不起作用

问题描述

所以基本上我是想使用它:

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'`");

即使它们完全可以在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()命令(期望在特定目录中运行的后续命令)。

最简单的方法是创建一个包含所有命令的临时脚本文件,并通过单个cd调用执行该命令:

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

将像您期望的那样在Windows Shell中工作。为此,您可能需要一个不同的解决方案,或一个像* nix这样的外壳程序来运行它(例如MinGw提供了一个)。