如何在PowerShell中获取并使用ADB命令的返回码与执行结果
PowerShell 正确获取ADB命令返回码解决方案
核心问题原因
你之前测试用的adb shell "pm uninstall com.google.android.apps.photos; echo $?"命令异常,是因为双引号包裹的内容会先被PowerShell解析,其中的$?会被替换为上一条PowerShell命令的执行状态,而非传递到安卓系统shell中获取卸载命令的返回值,所以永远返回True。
两种可靠的返回码获取方案
方案1:使用$LASTEXITCODE原生变量
PowerShell的$LASTEXITCODE专门用于存储外部可执行程序(如adb.exe)的退出码:adb命令执行成功返回0,执行失败返回非0值,直接判断该变量即可。
示例代码:
# 执行卸载命令 adb uninstall com.google.android.apps.photos # 执行结果判断 if ($LASTEXITCODE -eq 0) { Write-Host "应用卸载成功" } else { Write-Host "应用卸载失败,执行禁用操作" adb shell pm disable-user --user 0 com.google.android.apps.photos }
方案2:获取adb shell内部命令返回值
如果需要直接读取安卓shell中单条命令的执行结果,用单引号包裹shell指令,避免PowerShell提前解析变量:
# 单引号包裹指令,$?会传递到安卓shell执行 $uninstallResult = adb shell 'pm uninstall com.google.android.apps.photos; echo $?' # 判断返回结果的最后一行(即echo $?的输出)是否为0 if ($uninstallResult[-1] -eq 0) { Write-Host "卸载成功" } else { Write-Host "卸载失败,错误信息:$($uninstallResult[0])" }
完整批量卸载/禁用预装应用脚本实现
按照你需要的执行逻辑,完整脚本如下:
# 定义待处理的目标应用列表 $targetApps = @( "com.google.android.apps.photos", "com.example.bloatware.app1", "com.other.preinstall.app2" # 在此处添加其他目标应用包名 ) # 遍历处理所有应用 foreach ($app in $targetApps) { Write-Host "`n当前处理应用:$app" # 第一步:强制停止应用 adb shell am force-stop $app if ($LASTEXITCODE -ne 0) { Write-Host "强制停止失败,尝试杀死应用进程" adb shell am kill $app } # 第二步:尝试卸载应用 adb uninstall $app if ($LASTEXITCODE -eq 0) { Write-Host "应用 $app 卸载成功,跳过后续步骤" continue } # 第三步:卸载失败则尝试禁用 Write-Host "应用 $app 卸载失败,尝试为用户0禁用" adb shell pm disable-user --user 0 $app if ($LASTEXITCODE -eq 0) { Write-Host "应用 $app 禁用成功" } else { Write-Host "应用 $app 禁用失败,需手动处理" } }
注意事项
- 执行脚本前需先运行
adb devices确认设备已正常连接,且已开启USB调试并授权当前电脑- 部分系统核心预装应用受系统保护,无法通过adb卸载或禁用,属于正常现象
- 操作前请确认目标应用的作用,避免误删核心组件导致设备功能异常或变砖
内容的提问来源于stack exchange,提问作者tetratheta
相关产品推荐
相关产品推荐

