首页 > 解决方案 > 如何在 PowerShell 中使用 ADB 返回码(或结果)?

问题描述

我想制作删除预装应用程序的 PowerShell 脚本,并且我有这些应用程序的列表。

问题是,我想让脚本首先运行某个命令,并且只有当命令失败时,才运行另一个命令。

就像,如果脚本无法删除应用程序,那么它将尝试禁用该应用程序。无需尝试禁用已删除的应用程序,对吗?

adb shell am force-stop <app> # force stop app
adb shell am kill <app> # kill app if not force-stopped

adb uninstall <app> # remove app
adb shell pm disable-user --user 0 <app> # disable app for user 0 if not removed

是的,有一些已经回答的类似问题是这样的。但这些现在不起作用。

PS > adb shell "pm uninstall com.google.android.apps.photos; echo $?"
Failure [DELETE_FAILED_INTERNAL_ERROR]
True

即使命令失败(Failure),也会echo返回True

这是用最新的(几分钟前刚刚下载的)ADB 和 Android 11 测试的,所以我猜我的信息('那不起作用!')更“最新”。

那么,如何在PowerShell中使用ADB命令的返回码呢?

PS。如果您想要我编写的代码进行更多检查,这里是:LINK
它已被修改为不使用echo,但仍然没有成功。

标签: androidpowershelladb

解决方案


那么,如何在PowerShell中使用ADB命令的返回码呢?

正确的检查方法应该是:

adb devices
if($?) {
  echo "Command succedded"
} else {
  echo "Command failed!"
}

此外,还有另一个退出代码$LASTEXITCODE表示 0,如果命令执行没有任何异常;和非零值,如果命令因某些异常而失败。您可以将其用作:

if($LASTEXITCODE -eq 0) {
  echo "Command succedded"
} else {
  echo "Command failed!"
}

$?和的区别在于$LASTEXICODE前者返回Boolean,而后者返回Int32类型。

即使命令失败(Failure),echo 也会返回 True。

您面临此问题的真正问题是,因为您正在尝试卸载Google Photos应用程序,该应用程序是与其他 OEM 供应商应用程序一起预先捆绑的系统应用程序,具有最小版本。要卸载此类系统应用程序,您需要root 权限,可以使用--user 0flag 来激活adb pm命令,但您需要root 访问权限。当您购买新设备时,它已经作为系统应用程序安装并且可以更新。当您尝试卸载它时,它的更新将被卸载,系统将恢复最小的预捆绑版本,而不是完全卸载。这就是您收到Failure [DELETE_FAILED_INTERNAL_ERROR]消息并随后收到的原因True,这应该是False但命令不会抛出那个。诡异的。


推荐阅读