本帖最后由 powerbat 于 2012-3-7 22:41 编辑
支持拖放、支持子目录、支持设置要修改的文件类型(这些功能很简单,可自行添加代码),兼容特殊字符。 | @echo off &rem powerbat @ www.bathome.net 批处理之家 bat脚本 | | set "type=jpg,png" &rem 文件类型 | | set "folder=%~dp0." &rem 文件所在目录 | | set "SubDir=0" &rem 是否包含子目录 | | | | wmic.exe /? >nul 2>&1 || (echo no wmic, exit& pause&exit/b) | | | | if "%~1" neq "" set "folder=%~1" | | for %%a in ("%folder%") do set "FileD=%%~da" & set "FileP=%%~pnxa\" | | | | goto skip | | | | set "ext=%type%" & set "sub=" | | if "%type%" neq "*" if "%type%" neq "*.*" set "ext=*.%type:,= *.%" | | if "%SubDir%" neq "0" set "sub=/s" | | for /f "delims=" %%a in ('dir /b %sub% %ext%') do ( | | ren "%%~fa" "powerbat@bathome_%%~nxa" | | ) | | :skip | | | | set "part=%FileP:\=\\%" | | set "part=%part:[=[[]%" | | set "part=%part:_=[_]%" | | setlocal enableDelayedExpansion | | set "part=!part:%%=[%%]!" | | endlocal& set "part=%part%" | | if "%type%" neq "*" if "%type%" neq "*.*" ( | | set "ext=and (extension='%type:,=' OR extension='%')" | | ) else set "ext=" | | if "%SubDir%"=="0" ( | | set "Filter=drive='%FileD%' and path='%FileP:\=\\%' %ext%" | | ) else ( | | set "Filter=drive='%FileD%' and path LIKE '%part%%%' %ext%" | | ) | | (set wmic=wmic.exe datafile where "%Filter%" get name^,LastModified) | | | | for /f "tokens=1,3* delims=.+ " %%a in ('%%wmic%%') do ( | | set "t=%%a" | | | | for /f "delims=" %%i in ("%%c") do ( | | set "f=%%~fi" | | set "p=%%~dpi" | | set "n=%%~ni" | | set "x=%%~xi" | | setlocal enableDelayedExpansion | | set "t=!t:~,4!-!t:~4,2!-!t:~6,2! !t:~8,2!.!t:~10,2!.!t:~12!" | | if not exist "!p!!t!!x!" ( | | ren "!f!" "!t!!x!" | | ) else if "!t!" neq "!n!" ( | | set n=1 | | for %%u in ("!p!!t!_*!x!") do set /a n+=1 | | ren "!f!" "!t!_!n!!x!" | | ) | | endlocal | | ) | | ) | | pauseCOPY |
批处理在特殊字符方面有天生缺陷,所以用批处理要做到兼容特殊字符就有点吃力,效率不怎么高。
重命名时要考虑到的一个重点是判断是否存在重复文件名,由于cmd没有while循环语句,要达到类似效果只能借助标签,但这样会进一步降低效率。
在兼顾效率的基础上,这是采用的方法是先将所有文件修改为别的名字,彻底排除重复的可能性。(默认没有开启,将goto skip去掉即可启用)。
(批处理做这种事真是弱暴了。。。但我不想用vbs,虽然我会) |