假设一个“recent.m3u”文件(播放列表文件),里面的内容如下:- D:\a\ahaha\abc!.mp3
- D:\a\ohoho\a&bc.mp3
复制代码 (列表中只列出两个特殊的例子,本人真正在弄的是有上千个文件的列表。)
我想把列表中的文件,从“D:\a”复制到“D:\b”,且保留“D:\a”之下的目录结构。
也就是复制成“D:\b\ahaha\abc!.mp3”和“D:\b\ohoho\a&bc.mp3”。
然后由于“ahaha”和“ohoho”文件夹下有一些文件我不想要复制,所以不能用选中“ahaha”和“ohoho”然后复制粘贴的方法……
这样一来就得用批处理了……第一次,我的代码是这样的:- echo off & cls
- setlocal enabledelayedexpansion
- rem ==============================
- rem 变量定义
- set "rsc=D:\a"
- set "rplc=D:\b"
- rem ==============================
- rem 复制m3u播放列表中的文件,并在一定程度上保留其目录结构
- for /f "usebackq tokens=* eol=; delims=" %%a in ("recent.m3u") do (
- set "spth=%%a"
- set "pth=%%a"
- set "pth=!pth:%rsc%=%rplc%!"
- echo.!spth!
- call :MakeFolder "!pth!"
- if not exist "!pth!". (
- if not exist "!pth!". (
- copy /y "!spth!" "!pth!"
- ) else (
- echo.已存在,跳过!
- )
- )
- endlocal
- exit/b
- rem ==============================
- rem 创建目录的、类似于“函数”的存在
- :MakeFolder
- set "pth1=%~dp1"
- if not exist "%pth1%". md "%pth1%"
复制代码 用了上面的代码后发现只要m3u列表中的文件名中含有!、&等特殊符号的时候,这个文件就会复制失败,而其他文件OK!
经过疯狂的尝试,我用一个本人非常不喜欢的做法解决了它。于是代码变成这样……同时问题也解决了……- echo off & cls
- rem ==============================
- rem 变量定义
- set "rsc=D:\a"
- set "rplc=D:\b"
- rem ==============================
- rem 复制m3u播放列表中的文件,并在一定程度上保留其目录结构
- for /f "usebackq tokens=* eol=; delims=" %%a in ("recent.m3u") do (
- set "spth=%%a"
- set "pth=%%a"
- SETLOCAL ENABLEDELAYEDEXPANSION
- set "pth=!pth:%rsc%=%rplc%!"
- echo.!spth!
- call :MakeFolder "!pth!"
- if not exist "!pth!". (
- copy /y "!spth!" "!pth!"
- ) else (
- echo.已存在,跳过!
- )
- ENDLOCAL
- )
- pause
- exit/b
- rem 创建目录的、类似于“函数”的存在
- :MakeFolder
- set "pth1=%~dp1"
- if not exist "%pth1%". md "%pth1%"
- GOTO :EOF
复制代码 问题解决,经过反向推测,问题应该出在for语句一开始给“spth”和“pth”赋值为“%%a”这里。在第一个代码里,这个时候的变量延缓是开着的。所以,MP3文件名中的“!”就被当成是变量的标识符了,所以文件名赋到变量里的时候就已经出错了。
而在第二个代码里,把变量延迟放到赋值后才打开,这样赋到变量里的文件名就没错了……
不过在FOR语句里面不停地SETLOCAL、ENDLOCAL感觉不太爽,哪位大哥有更好的解决办法?
还有那位说把!换成^!的兄台,首先要声明,文件名是从列表中读取的,所以不可能预先把!改成^!,就算要用set来替换也很麻烦。
然后请你试一下,在开启变量延迟的情况下,定义一下变量复制代码 ,然后用复制代码 ,就像下面的代码,如果你的想法正确的话,结果会是这样:“!a!=我的变量”,但结果不是……- echo off & cls
- setlocal enabledelayedexpansion
- set "a=我是变量"
- echo.^!a^!=!a!
- endlocal
- pause
- exit/b
复制代码
[ 本帖最后由 MantisLin 于 2011-2-24 23:17 编辑 ] |