批處理新手入門導讀[視頻教程]批處理基礎視頻教程[視頻教程]VBS基礎視頻教程
[批處理文件精品]批處理版照片整理器[批處理文件精品]純批處理備份&還原驅動在線第三方下載
返回列表 發帖
原帖由 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

  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

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

TOP

回復 5# batman
  1. for /f "tokens=%n% delims=%str% " %%a in ("%var%")
復制代碼
變量引用有誤,原文件名字符串中含感嘆號包裹,會造成感嘆號之間的字母當作變量是為空值不存在。如:一[email protected]_ s%#8i  三 c.rar    ----> !a!    最后處理出來是 : bsic.rar
應防止變量值中含感嘆號,該這樣寫:
  1. for /f "tokens=%n% delims=%str% " %%a in ("!var!")
復制代碼
測試成功。
感謝5樓提供的處理思路。
我就是我,不一樣的煙火!

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

返回列表
36选7开奖结果今天福建 澳门正规赌博官方网址 决定股票涨跌的因素 炒股app排行榜前十名 什么是股票融资贷款 佳永配资,具有实力的配资平台 如何看股票指数及数据 20140130上证指数 114股票分析 2019车小将最新消息 云南省十一选五走势 城豪娱乐 安徽快3开奖官网 专业期货配资 吉林快3一码遗漏 山东体彩11选五最大遗漏 股票分析网站