问题描述
所以基本上我是想使用它:
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提供了一个)。