批处理执行adb+SQLite SELECT语句报错「Error: incomplete input」求助
解决批处理中adb执行sqlite3 SELECT语句报错的问题
问题根源
你遇到的Error: incomplete input是因为Windows批处理的命令解析规则,以及多层shell(adb shell → su → sqlite3)对特殊字符(分号;)的处理冲突:
- 批处理会把分号当作命令分隔符,提前截断了sqlite3的查询语句
- 多层引号嵌套的解析错误,导致sqlite3没有收到完整的SELECT命令
而.tables能正常运行,是因为这个sqlite3内置命令不需要分号也能执行,且没有触发批处理的特殊字符解析问题。
解决方案
方法1:调整引号嵌套并转义分号
在批处理中,用双引号嵌套(两个双引号表示一个双引号),同时用^转义分号,避免被批处理截断:
adb shell "su -c ""sqlite3 /data/user_de/0/com.android.providers.telephony/databases/mmssms.db 'select * from sms^;'"""
- 外层双引号包裹adb shell的整个命令
- 用
""表示su命令内部的双引号 - 分号前加
^,让批处理把它当作普通字符传递给sqlite3
方法2:使用临时SQL文件(更可靠)
如果转义还是有问题,推荐把查询语句写入临时文件,再推送到设备执行:
- 创建
query.sql文件,内容为:
select * from sms;
- 执行批处理命令:
:: 推送SQL文件到设备 adb push query.sql /data/local/tmp/ :: 执行sqlite3读取文件内容 adb shell "su -c ""sqlite3 /data/user_de/0/com.android.providers.telephony/databases/mmssms.db < /data/local/tmp/query.sql""" :: 删除临时文件 adb shell "rm /data/local/tmp/query.sql"
这种方法彻底避免了命令行的特殊字符解析问题,稳定性更高。
内容的提问来源于stack exchange,提问作者Dario Viva
相关产品推荐
相关产品推荐

