0%

#批处理# 又一个天坑

本来想做一个walkman同步工具,可以在向设备自动复制音乐的同时根据电脑上音乐文件夹的名字新建或者更新播放列表,但是尽管脚本运行得很顺利,生成的播放列表却不能被设备识别,算是一个天坑工程了。但是这个脚本里使用了多个新颖的地址裁切方式,还是有必要留作纪念以便日后查阅。在此将源代码与注释写在下面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
@echo off
set pc_playlist_root_path=C:\Users\z8442\Desktop\test rem 设置电脑端同步地址
setlocal EnableDelayedExpansion
for /f "delims=" %%h in ('dir /b /ad %pc_playlist_root_path% ') do (
set pc_playlist_floder_path_pre=!pc_playlist_root_path!\%%h
call :continue !pc_playlist_floder_path_pre! rem 遍历电脑端同步地址内的文件,得到完整的文件路径
)
goto :eof
:continue
set pc_playlist_floder_path=%~f1 rem
set device_root_path=C:\Users\z8442\Desktop\walkman rem 设置设备根目录

call :cutA %pc_playlist_floder_path% rem 将得到的完整文件路径分离为播放列表名与去引号的完整文件路径
call :cutB %device_root_path% rem 将得到的设备根目录分解得到设备根目录盘符与去引号的设备根目录
cd\
%device_root_mark%
cd %device_root_path% rem 将目前的工作环境切换到设备根目录
if exist %playlist_name%.m3u goto :ecopy rem 检查播放列表是否存在
echo 新播放列表!
echo #EXTM3U>%playlist_name%.m3u rem 若不存在,用分离得到的名字新建一个播放列表
setlocal EnableDelayedExpansion
for /f "delims=" %%a in ('dir /b/a-d/oN "%pc_playlist_floder_path%"') do (
copy /y "%pc_playlist_floder_path_no_quotation_marks%\%%a" "%device_root_path%"
echo #EXTINF:0,%%~na>>%playlist_name%.m3u rem 逐个复制文件,每复制一个,在播放列表中写一行“#EXTINF:0,文件名”
echo %%a>>%playlist_name%.m3u rem 再将无盘符的文件路径追加在下面一行
)
goto :eof
:ecopy rem 若已存在,直接追加
setlocal EnableDelayedExpansion
for /f "delims=" %%a in ('dir /b/a-d/oN "%pc_playlist_floder_path%"') do (
findstr "%%~na" "%device_root_path_no_quotation_marks%\%playlist_name%.m3u" rem 寻找设备中没有但电脑中有的文件,如果有,将其同步到设备上
if !errorlevel!==1 (
copy /y "%pc_playlist_floder_path_no_quotation_marks%\%%a" "%device_root_path%"
echo 新文件!
echo #EXTINF:0,%%~na>>%playlist_name%.m3u rem 每复制一个,在播放列表中写一行“#EXTINF:0,文件名”
echo %%a>>%playlist_name%.m3u ) rem 再将无盘符的文件路径追加在下面一行
)
goto :eof

:cutA
set playlist_name=%~n1 rem 切割播放列表名
set pc_playlist_floder_path_no_quotation_marks=%~f1 rem 去掉引号
goto :eof
:cutB
set device_root_path_no_quotation_marks=%~f1 rem 去掉引号
set device_root_mark=%~d1 rem 获得设备所在的盘符
goto :eof