如何在 PowerShell 中使用 ADB return 代码(或结果)?

How to use ADB return code (or result) in PowerShell?

我想制作删除预装应用程序的 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

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

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

即使命令失败(Failure),echo returns True.

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

那么,如何在PowerShell中使用returnADB命令的代码?

PS。如果你想要我为更多检查编写的代码,这里是:LINK
已经修改为不用echo,还是没有成功

So, how to use return code of ADB command in PowerShell?

正确的检查方法应该是:

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

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

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

$?$LASTEXICODE的区别在于前者returnsBoolean,而后者returns是Int32类型.

Even if the command failed(Failure), echo returns True.

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