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

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

[复制链接]
发表于 2008-8-20 12:45:21 | 显示全部楼层
原帖由 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

评分

参与人数 1PB +8 收起 理由
pusofalse + 8

查看全部评分

发表于 2015-9-27 09:53:49 | 显示全部楼层
  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
复制代码
发表于 2017-5-15 15:45:28 | 显示全部楼层
能不能直接用通配符呢………………
比如*.doc 然后改成你想要的就可以了…………反正也只有唯一的三种文件,不用担心改错……
发表于 2018-9-5 20:47:43 | 显示全部楼层
回复 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楼提供的处理思路。
发表于 2018-9-5 21:21:00 | 显示全部楼层
回复 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.                 ::截取文件名,不含扩展名
  9.                 set "name=%%~ni" & set "old=%%~nxi"
  10.                 ::避免文件名中有感叹号,动态感知变量值的变化
  11.                 setlocal enabledelayedexpansion
  12.                
  13.                 set "name1=!name!" & call :loop
  14.                 echo;!nam!               
  15.                 ren "!old!" "!nam!%%~xi"
  16.                
  17.                 ::用完一次清除该变量。避免下次使用还有残留值。
  18.                 set "nam="       
  19.                
  20.                 endlocal
  21.         )
  22. )

  23. pause>nul & goto :eof

  24. :loop
  25. if defined name1 (
  26.         ::逐个截取字符作判断
  27.         set "var=!name1:~0,1!"
  28.         ::忽略大小写,保证值在字母头尾之间
  29.         if /i "!var!" leq "Z" (
  30.                 if /i "!var!" geq "A" (
  31.                         ::满足上面两个条件下作字符串拼接,即有效文件名拼接。
  32.                         set "nam=!nam!!var!"
  33.                 )
  34.         )
  35.         ::每次循环后,从左往右依次截断字符串。直至把字符串截取完成空。
  36.         set "name1=!name1:~1!"
  37.         goto loop
  38. )


复制代码
发表于 2021-3-10 16:37:24 | 显示全部楼层
本帖最后由 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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 20:55 , Processed in 0.019650 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表