记录一下 | 关于adb命令中空格的坑

1,541 阅读2分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战

记录一下我在node中遇到的一个小问题,由于手机上的照片、视频、录音等等数据是要备份的,所以最近在写一个关于手机备份脚本。其中使用到了child_process中的execSync方法,发现使用这个方法执行adb命令时,当命令中的路径出现空格时自动结束命令。

image-20220126205233820

从图中可以发现,第一个语音文件中在26日后面多了一个空格,它会导致使用execSync方法时错误的把命令结束掉.....

正常移动一个文件夹中的文件到files文件夹下的adb命令是这样子的,下面这条adb命令是没有问题的

// 这样子运行是没有问题的
execSync('adb pull /sdcard/MIUI/sound_recorder/ ./files/')

我们看下面这一条adb命令,我在路径下加入了文件名在移动到files文件夹中。此时你使用执行这段代码node抛出一个错误出来

Error: Command failed: adb pull /sdcard/MIUI/sound_recorder/1月26日 上午2点11分.aac ./files/

execSync('adb pull /sdcard/MIUI/sound_recorder/1月26日 上午2点11分.aac ./files/')

排查

将这一条adb命令拿出来,直接在终端上跑一下。

PS E:\project\script\file-to-pc-node\src> adb pull /sdcard/MIUI/sound_recorder/126日 上午211分.aac ./files/
adb: error: failed to stat remote object '/sdcard/MIUI/sound_recorder/1月26日': No such file or directory
adb: error: failed to stat remote object '上午2点11分.aac': No such file or directory

直接报错,发现问题是这个adb命令本身的问题,它把空格当成了参数的分割。

解决方案

在这条adb命令上,把命令的路径参数使用双引号包裹起来。

adb pull "/sdcard/MIUI/sound_recorder/1月26日 上午2点11分.aac" "./files/1月26日 上午2点11分.aac"

回到刚刚的execSync函数上,我们知道单引号里面是可以使用双引号的,所以我们用双引号把参数包裹起来,再运行一下就可以解决了。

execSync('adb pull "/sdcard/MIUI/sound_recorder/1月26日 上午2点11分.aac" "./files/1月26日 上午2点11分.aac"')