「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」
记录一下我在node中遇到的一个小问题,由于手机上的照片、视频、录音等等数据是要备份的,所以最近在写一个关于手机备份脚本。其中使用到了child_process中的execSync方法,发现使用这个方法执行adb命令时,当命令中的路径出现空格时自动结束命令。
从图中可以发现,第一个语音文件中在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/1月26日 上午2点11分.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"')