[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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:

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

本帖最后由 qixiaobin0715 于 2021-3-10 22:01 编辑

考虑的还不是太完善:
  1. @echo off
  2. for %%a in (*) do (
  3.     if "%%~nxa" neq "%~nx0" (
  4.         set "filename=%%~na"
  5.         set "str=%%a"
  6.         setlocal enabledelayedexpansion
  7.         set "filename=!filename: =!
  8.         for /l %%b in (0,1,50) do (
  9.             set "str1=!filename:~%%b,1!"
  10.             echo,!str1!|findstr [a-z]>nul 2>nul&&set str2=!str2!!str1!
  11.         )
  12.         ren "!str!" "!str2!%%~xa"
  13.         set str2=
  14.         endlocal
  15.     )
  16. )
  17. pause
复制代码

TOP

回复 2# pusofalse


    在你思路上进行严格地判断改进了下:
  1. @echo off
  2. cd /d %~dp0
  3. ::思路:通过字母字符范围大小,逐个字符比较,保留英文字母。
  4. for /f "delims=" %%i in ('dir /b /a-d') do (
  5. ::排除批处理自身
  6. if "%%~nxi" neq "%~nx0" (
  7. ::截取文件名,不含扩展名
  8. set "name=%%~ni" & set "old=%%~nxi"
  9. ::避免文件名中有感叹号,动态感知变量值的变化
  10. setlocal enabledelayedexpansion
  11. set "name1=!name!" & call :loop
  12. echo;!nam!
  13. ren "!old!" "!nam!%%~xi"
  14. ::用完一次清除该变量。避免下次使用还有残留值。
  15. set "nam="
  16. endlocal
  17. )
  18. )
  19. pause>nul & goto :eof
  20. :loop
  21. if defined name1 (
  22. ::逐个截取字符作判断
  23. set "var=!name1:~0,1!"
  24. ::忽略大小写,保证值在字母头尾之间
  25. if /i "!var!" leq "Z" (
  26. if /i "!var!" geq "A" (
  27. ::满足上面两个条件下作字符串拼接,即有效文件名拼接。
  28. set "nam=!nam!!var!"
  29. )
  30. )
  31. ::每次循环后,从左往右依次截断字符串。直至把字符串截取完成空。
  32. set "name1=!name1:~1!"
  33. goto loop
  34. )
复制代码
我就是我,不一样的烟火!

TOP

回复 5# batman
  1. for /f "tokens=%n% delims=%str% " %%a in ("%var%")
复制代码
变量引用有误,原文件名字符串中含感叹号包裹,会造成感叹号之间的字母当作变量是为空值不存在。如:一b!a!1235@_ s%#8i  三 c.rar    ----> !a!    最后处理出来是 : bsic.rar
应防止变量值中含感叹号,该这样写:
  1. for /f "tokens=%n% delims=%str% " %%a in ("!var!")
复制代码
测试成功。
感谢5楼提供的处理思路。
我就是我,不一样的烟火!

TOP

能不能直接用通配符呢………………
比如*.doc 然后改成你想要的就可以了…………反正也只有唯一的三种文件,不用担心改错……

TOP

  1. @echo off
  2. 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"
  3. for /f "delims=" %%a in ('dir /b *^|findstr /vc:"%~nx0"') do (
  4. set k=
  5. set wenben=%%~na
  6. set wenjian=%%a
  7. setlocal enabledelayedexpansion
  8. for /l %%b in (0,1,50) do (
  9.     set zimu=!wenben:~%%b,1!
  10. for %%c in (!z!) do (
  11.        if /i "!zimu!"=="%%c" set k=!k!!zimu!
  12.    )
  13. )
  14. ren "!wenjian!" "!k!%%~xa"
  15. endlocal
  16. )
  17. pause
复制代码
心累~努力,为了美好的明天。

TOP

原帖由 pusofalse 于 2008-8-5 23:34 发表
看到terse前辈的代码,忽然闪现了一个思路,但立刻消失了,觉得这题肯定有更简单的方法。
只需思考一个问题,如何把字母从这一堆特殊字符中提取出来即可。

根据 pusofalse斑竹的思路,提取字符最方便的工具肯定是正则表达式,批处理命令唯一一个支持正则的就是findstr,能不能用它来提取呢?
测试成功!
满足要求:简洁、通用、效率不至于太低。
特点:通用性很强,只需要修改 findstr 的正则参数就能实现各种功能,举几个例子。
   "[^-!-~0-9a-z]"  保留全角字符(中文、全角标点等)
   "[a-z0-9]"   保留英文字母和数字

@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
1

评分人数

TOP

回复 13楼 的帖子

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

TOP

很有意思的说。。。。

TOP

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

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

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

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

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

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

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

TOP

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

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

TOP

返回列表