[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-004】批处理重命名特殊文件名

---------------------------------------------------------------------------------------------------------------------------------------------

文件夹下有三个由字母、数字、汉字、特殊字符组成文件名的文件同时批处理自身也在其中:
一b!a!1235@_ s%#8i  三 c.rar
h^e12 0~%l%!p!@. s321-的文件.txt
%o%%% !O!ffi9~  ce$- Wor8d29 文档.docx
重命名.bat
图1:

---------------------------------------------------------------------------------------------------------------------------------------------
要求运行批处理将这三个文件文件名中的数字、汉字、特殊字符全部(含空格)去掉,而重命名为只含字母的文件,但
后缀名不能更改,同时批处理自身名字不能更改,重命名后:
basic.rar
helps.txt
oOfficeWor.docx
重命名.bat
图2:

---------------------------------------------------------------------------------------------------------------------------------------------
要求:代码简洁、通用、效率不至于太低。
---------------------------------------------------------------------------------------------------------------------------------------------
***共同提高***

  1. @echo off
  2. for %%a in (*.*) do (
  3.     if "%%~nxa" neq "%~nx0" (
  4.         set "name=%%~na"
  5.         setlocal enabledelayedexpansion
  6.         set name1=!name!
  7.         call :lp
  8.         ren "!name!%%~xa" "!nam!%%~xa"
  9.         set "nam="
  10.         endlocal
  11. )
  12. )
  13. pause
  14. :lp
  15. if defined name1 (
  16. set "var=!name1:~,1!"
  17. if "!var!" leq "Z" (
  18. if "!var!" geq "a" (
  19. set "nam=!nam!!var!"
  20. ))
  21. set "name1=!name1:~1!"
  22. goto lp
  23. )
复制代码
我是最怕特殊字符的。。。T.T

[ 本帖最后由 pusofalse 于 2008-7-27 18:48 编辑 ]
2

评分人数

心绪平和,眼藏静谧。

TOP

if "!var!" leq "Z" (
if "!var!" geq "a" (
这两句用得好,不过我还没找相关理论来支持这样的用法,这又回到了if究竟是怎么进行字
符判断的这个问题上来了。

要指出的是在这里if应该为if /i。
***共同提高***

TOP

我觉得不用改啊
我这里的z是大写啊~

[ 本帖最后由 pusofalse 于 2008-7-27 21:09 编辑 ]
心绪平和,眼藏静谧。

TOP

来个新思路(思路是namejm的);
  1. @echo off
  2. set "code=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"
  3. for /f "delims=" %%a in ('dir /s /a-d /b') do (
  4.     if "%%~nxa" neq "重命名.bat" (
  5.        set "str=%%~na"&set "file=%%a"&set "var=%%~na"
  6.        setlocal enabledelayedexpansion
  7.        for %%i in (%code%) do set "str=!str:%%i=!"
  8.        set "str=!str: =!"&call :lp
  9.        ren "!file!" !files!%%~xa
  10.        endlocal
  11. ))
  12. goto :eof
  13. :lp
  14. set /a n+=1
  15. for /f "tokens=%n% delims=%str% " %%a in ("%var%") do (
  16.      if "%%a" neq "" set "files=!files!%%a"&goto lp
  17. )
复制代码

描述下整体思路吧:

----------------------------------------------------------------------------------------------------------------------------------------------------

     大家看到了题中的文件名是由字母+数字+特殊字符+汉字组成的,看起来很复杂,但我们是不是可以换个角度这样看:文件名是由分隔符+字母组成的(将数字、特殊字符、汉字全看成分隔符),是不是简单多了,呵呵,麻烦的还在后面。。。

----------------------------------------------------------------------------------------------------------------------------------------------------
     那么,我们又遇到问题了:数字、特殊字符还好说数量是有限的,汉字可是个麻烦事啊,我们总不能在delims=后面把所有汉字全写上吧(况且这个长度是有限的)?这是不可能的,怎么办呢?于是,我们可以先将文件名中不是字母的字符全提出来,怎么提?这就要用到变量替换了,将26个字母全替换为空。
----------------------------------------------------------------------------------------------------------------------------------------------------

    有人会说了效率有问题,这里确实存在效率问题,但大家想一下比较逐字符的判断的效率这个还是要高一点,为什么?假设一个文件名有十几个a,用逐字符就要判断十几次,而变量替换只一次就搞定了。
----------------------------------------------------------------------------------------------------------------------------------------------------

    经过这样替换后的字符串中是不是只留下了不是字母的字符。现在只要把其来做为分隔符(别忘了加上空格)来提取文件名中的所有的字母了,而剩下的工作就只是技术处理了。
----------------------------------------------------------------------------------------------------------------------------------------------------







[ 本帖最后由 batman 于 2008-7-28 01:23 编辑 ]
2

评分人数

***共同提高***

TOP

  1. @echo off
  2. for /f "delims=" %%a in ('dir /b/a-d "*.*"') do (
  3.    if not "%%~nxa"=="%~nx0" (
  4.       set "more=%%a"&set "mo=%%~na"&set "n=0"&set "ming="
  5.       setlocal enabledelayedexpansion
  6.       call :mo
  7.       ren "!more!" "!ming!%%~xa"
  8.       endlocal
  9.    )
  10. )
  11. pause&exit
  12. :mo
  13. if not "!mo:~%n%,1!"=="" (
  14.    set "niu=!mo:~%n%,1!"
  15.    call :niu
  16.    set /a "n+=1"
  17.    goto :mo
  18. )
  19. goto :eof
  20. :niu
  21. for %%b 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 (
  22.    if /i "%niu%"=="%%b" (set "ming=!ming!%niu%"&goto :eof)
  23. )
复制代码
1

评分人数

TOP

5楼的代码运行不成功

TOP

原帖由 more 于 2008-7-28 00:53 发表
5楼的代码运行不成功

我都测试了N次了,怎么会不成功
***共同提高***

TOP

原帖由 batman 于 2008-7-28 01:16 发表

我都测试了N次了,怎么会不成功

昨天晚上测试的时候不行,今天早上却可以,怪...

TOP

  1. @echo off
  2. 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
  3. for %%i in (*.*) do (
  4.     if not "%%~nxi"=="%~nx0" (
  5.         set "name=%%~ni"
  6.         setlocal enabledelayedexpansion
  7.         set name1=!name!
  8.         call :lp
  9.         ren "!name!%%~xi" "!nam!%%~xi"
  10.         set "nam="
  11.         endlocal
  12.      )
  13.   )
  14. pause&goto :eof
  15. :lp
  16. if defined name1 (
  17.    set "var=!name1:~,1!"
  18.    if defined !var! set "nam=!nam!!var!"
  19.    set name1=!name1:~1!
  20.    goto lp
  21. )
复制代码
1

评分人数

TOP

看到terse前辈的代码,忽然闪现了一个思路,但立刻消失了,觉得这题肯定有更简单的方法。
只需思考一个问题,如何把字母从这一堆特殊字符中提取出来即可。
心绪平和,眼藏静谧。

TOP

写了将近一个小时,做是做出来了,但并不简洁。
  1. @echo off
  2. for %%a in (*.*) do (
  3. if "%%~nxa" neq "%~nx0" (
  4. set "name=%%~na"
  5. call,set name=%%name: =%%
  6. call,set name=%%name:!=%%
  7. setlocal enabledelayedexpansion
  8. for /l %%s in (0 1 9) do set name=!name:%%s=!
  9. set name=!name:%%=!
  10. for %%s in (@ _ # . $ - ^&) do set name=!name:%%s=!
  11. call :lp !name!
  12. echo !nam!%%~xa&set "nam="
  13. endlocal
  14. ))
  15. pause&exit/b
  16. :lp
  17. for /f "tokens=1* delims=~" %%l in ("%1") do (
  18. set "n=!n!%%l
  19. if "%%m" neq "" (
  20. call :lp %%m
  21. ) else (
  22. 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 !
  23. for %%a in (!n!) do if "%%a" geq "a" if "%%a" leq "Z" set nam=!nam!%%a
  24. ))
复制代码
心绪平和,眼藏静谧。

TOP

楼上的没用。不用达到目的。

TOP

很有意思的说。。。。

TOP

回复 13楼 的帖子

我可是测试了好多遍的,特殊字符无非就是那么几个而已。
心绪平和,眼藏静谧。

TOP

返回列表