batman 当前离线
考官
荣誉版主
qixiaobin0715 当前离线
大校
@echo off for %%a in (*) do ( if "%%~nxa" neq "%~nx0" ( set "filename=%%~na" set "str=%%a" setlocal enabledelayedexpansion set "filename=!filename: =! for /l %%b in (0,1,50) do ( set "str1=!filename:~%%b,1!" echo,!str1!|findstr [a-z]>nul 2>nul&&set str2=!str2!!str1! ) ren "!str!" "!str2!%%~xa" set str2= endlocal ) ) pause复制代码
TOP
ai20110304 当前离线
一级士官
@echo off cd /d %~dp0 ::思路:通过字母字符范围大小,逐个字符比较,保留英文字母。 for /f "delims=" %%i in ('dir /b /a-d') do ( ::排除批处理自身 if "%%~nxi" neq "%~nx0" ( ::截取文件名,不含扩展名 set "name=%%~ni" & set "old=%%~nxi" ::避免文件名中有感叹号,动态感知变量值的变化 setlocal enabledelayedexpansion set "name1=!name!" & call :loop echo;!nam! ren "!old!" "!nam!%%~xi" ::用完一次清除该变量。避免下次使用还有残留值。 set "nam=" endlocal ) ) pause>nul & goto :eof :loop if defined name1 ( ::逐个截取字符作判断 set "var=!name1:~0,1!" ::忽略大小写,保证值在字母头尾之间 if /i "!var!" leq "Z" ( if /i "!var!" geq "A" ( ::满足上面两个条件下作字符串拼接,即有效文件名拼接。 set "nam=!nam!!var!" ) ) ::每次循环后,从左往右依次截断字符串。直至把字符串截取完成空。 set "name1=!name1:~1!" goto loop )复制代码
for /f "tokens=%n% delims=%str% " %%a in ("%var%") 复制代码
for /f "tokens=%n% delims=%str% " %%a in ("!var!")复制代码
无忧 当前离线
上等兵
尘丶 当前离线
四级士官
@echo off set "z=a b c d e f g h i j k l m n o p q r s t u v w x y z" for /f "delims=" %%a in ('dir /b *^|findstr /vc:"%~nx0"') do ( set k= set wenben=%%~na set wenjian=%%a setlocal enabledelayedexpansion for /l %%b in (0,1,50) do ( set zimu=!wenben:~%%b,1! for %%c in (!z!) do ( if /i "!zimu!"=="%%c" set k=!k!!zimu! ) ) ren "!wenjian!" "!k!%%~xa" endlocal ) pause复制代码
dishuo 当前离线
原帖由 pusofalse 于 2008-8-5 23:34 发表 看到terse前辈的代码,忽然闪现了一个思路,但立刻消失了,觉得这题肯定有更简单的方法。 只需思考一个问题,如何把字母从这一堆特殊字符中提取出来即可。
@echo off&cls for /f "tokens=*" %%i in ('dir /b/a-d "*.*"') do ( if "%%~nxsi" neq "%~nxs0" ( set "旧文件名=%%~nxsi"&set "文件名串=%%~ni"&set "新文件名="&set "counter=0" del ~filenamechar.lst /q>nul 2>&1 setlocal enabledelayedexpansion call :split for /f "tokens=*" %%n in ('findstr "[a-z]" ~filenamechar.lst') do set "新文件名=!新文件名!%%n" if "!新文件名!" neq "" ( echo ren !旧文件名! !新文件名!%%~xi ) else ( echo ^(文件"!旧文件名!"不含字母,不能重命名.^) ) endlocal ) ) del ~filenamechar.lst /q>nul 2>&1 pause&goto :eof :split if "!文件名串:~%counter%,1!" neq "" ( if "!文件名串:~%counter%,1!" neq " " echo !文件名串:~%counter%,1!>>~filenamechar.lst set /a counter+=1 goto split ) goto :eof
评分人数
pusofalse 当前离线
愚无尽 当前离线
六级士官
tjtchly 当前离线
二级士官
@echo off for %%a in (*.*) do ( if "%%~nxa" neq "%~nx0" ( set "name=%%~na" call,set name=%%name: =%% call,set name=%%name:!=%% setlocal enabledelayedexpansion for /l %%s in (0 1 9) do set name=!name:%%s=! set name=!name:%%=! for %%s in (@ _ # . $ - ^&) do set name=!name:%%s=! call :lp !name! echo !nam!%%~xa&set "nam=" endlocal )) pause&exit/b :lp for /f "tokens=1* delims=~" %%l in ("%1") do ( set "n=!n!%%l if "%%m" neq "" ( call :lp %%m ) else ( for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set n=!n:%%a= %%a ! for %%a in (!n!) do if "%%a" geq "a" if "%%a" leq "Z" set nam=!nam!%%a ))复制代码
terse 当前离线
中将
@echo off for %%i in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set %%i=a for %%i in (*.*) do ( if not "%%~nxi"=="%~nx0" ( set "name=%%~ni" setlocal enabledelayedexpansion set name1=!name! call :lp ren "!name!%%~xi" "!nam!%%~xi" set "nam=" endlocal ) ) pause&goto :eof :lp if defined name1 ( set "var=!name1:~,1!" if defined !var! set "nam=!nam!!var!" set name1=!name1:~1! goto lp )复制代码
more 当前离线
技术组成员
原帖由 batman 于 2008-7-28 01:16 发表 我都测试了N次了,怎么会不成功
原帖由 more 于 2008-7-28 00:53 发表 5楼的代码运行不成功