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

提高兼容性和准确率:
  1. @echo off>nul 2>nul 3>nul 4>nul
  2. for /l %%a in (1 1 8) do (for /l %%b in (1 1 7) do echo asfdf:%random%)>%%a.txt
  3. for /f "delims=" %%a in ('dir /a-d /b *.txt') do (
  4.    set a=
  5.    (for /f "useback delims=" %%b in ("%%a") do (
  6.       if defined a (echo;%%b) else (
  7.          for /f delims^=\/:*?^<^>^|^" %%c in ("%%b") do set "a=%%c"
  8.          if not defined a echo;%%b
  9.       )
  10.    ))>$
  11.    if not defined a set "a=%%~na"
  12.    rem 获取文件名和输出文本
  13.    set $=!a!#
  14.    set len=0
  15.    for %%a in (32 16 8 4 2 1) do (
  16.       if !$:~%%a^,1!. NEQ . set/a len+=%%a&set $=!$:~%%a!
  17.    )
  18.    rem 计算文件名长度
  19.    set n=
  20.    setlocal enabledelayedexpansion
  21.    for %%b in (!len!) do (
  22.       for %%c in ("!a!*.tx$") do (
  23.          for /f %%d in ("!n!") do endlocal&set n=%%~d
  24.          set test=%%~nc
  25.          setlocal enabledelayedexpansion
  26.          rem 转换变量
  27.          for /f "tokens=1-3 delims=0123456789" %%d in (
  28.             "!test:~%%b!\"
  29.          ) do (
  30.             if %%f neq \ set /a n-=1
  31.          )
  32.          rem 排除文件名干扰
  33.       )
  34.    )
  35.    move $ "!a!!n!.tx$"
  36.    Endlocal
  37. )
  38. del /f /a *.txt
  39. ren *.tx$ *.txt
  40. rem 取代原有的txt
  41. pause>con
复制代码

TOP

逻辑错误,已经修改

TOP

回复 8# chenyanroger


    “\/:*?<>|" ”这几个字符本来就是不允许出现在文件名中的,碰到含有此字符的行,究竟是跳过呢?还是截断呢?还是替换呢?

TOP

写这么长是为了尽可能提高兼容性:
  1. @echo off>nul 2>nul 3>nul 4>nul
  2. for /f "delims=" %%a in ('dir /a-d /b *.txt') do (
  3.    set a=
  4.    (for /f "useback delims=" %%b in ("%%a") do (
  5.       if defined a (echo;%%b) else (
  6.          set a=%%b
  7.          setlocal enabledelayedexpansion
  8.          set a=!a:?=-!
  9.          for %%c in (\ / : ^< ^> ^| ^") do if defined a set a=!a:%%c=-!
  10.          for /f "tokens=1* delims=*" %%c in ("!a!") do (
  11.             for /f "delims=" %%e in ("!a!") do (
  12.                endlocal&set a=%%e
  13.                if "%%d" neq "" (
  14.                   setlocal enabledelayedexpansion
  15.                   for /l %%a in (0 1 63) do (
  16.                      if "!a:~%%a,1!"=="*" (
  17.                         set "m=!m!-"
  18.                      ) else set "m=!m!!a:~%%a,1!"
  19.                   )
  20.                ) else setlocal enabledelayedexpansion
  21.             )
  22.          )
  23.          for /f "delims=" %%c in ("!a!") do endlocal&set a=%%c
  24.          rem 替换特殊字符为-
  25.          if not defined a echo;%%b
  26.       )
  27.    ))>$
  28.    if not defined a set "a=%%~na"
  29.    rem 获取文件名和输出文本
  30.    set $=!a!#
  31.    set len=0
  32.    for %%a in (32 16 8 4 2 1) do (
  33.       if !$:~%%a^,1!. NEQ . set/a len+=%%a&set $=!$:~%%a!
  34.    )
  35.    rem 计算文件名长度
  36.    set n=
  37.    setlocal enabledelayedexpansion
  38.    for %%b in (!len!) do (
  39.       for %%c in ("!a!*.tx$") do (
  40.          for /f %%d in ("!n!") do endlocal&set n=%%~d
  41.          set test=%%~nc
  42.          setlocal enabledelayedexpansion
  43.          rem 转换变量
  44.          for /f "tokens=1-3 delims=0123456789" %%d in (
  45.             "!test:~%%b!\"
  46.          ) do (
  47.             if %%f neq \ set /a n-=1
  48.          )
  49.          rem 排除文件名干扰
  50.       )
  51.    )
  52.    move $ "!a!!n!.tx$"
  53.    endlocal
  54. )
  55. del /f /a *.txt
  56. ren *.tx$ *.txt
  57. :: 取代原有的txt
  58. pause>con
复制代码
总结:批处理中的 * 和 ! 真蛋疼

TOP

返回列表