Board logo

标题: [文件操作] [已解决]批量修改后缀名的批处理怎样完善? [打印本页]

作者: lujice    时间: 2011-1-21 11:47     标题: [已解决]批量修改后缀名的批处理怎样完善?

代码如下:
  1. @echo off
  2. :0
  3. cls
  4. echo.
  5. echo.                               ╭────────╮
  6. echo.          ╭───────┤ 使 用  说 明 ├───────╮
  7. echo.          │                   ╰────────╯                 │
  8. echo.          │                                                               │
  9. echo.          │   1、本工具的用途是——把指定目录      │
  10. echo.          │      里,某类指定后缀名的文件,批        │
  11. echo.          │      量的修改为其它指定的后缀名。        │
  12. echo.          │                                                               │
  13. echo.          │   2、每一步输入完毕,都请敲回车!     │
  14. echo.          │                                                               │
  15. echo.          │   3、注意——只输入后缀名,不要         │
  16. echo.          │      输入后缀名前的“.”                         │
  17. echo.          │                                                               │
  18. echo.          │   4、文件夹的路径中如有空格和特殊      │
  19. echo.          │      字符,请手打输入,不要拖放!        │
  20. echo.          │                                                               │
  21. echo.          ╰────────────────────────╯
  22. echo.&echo           请输入文件夹的路径,或拖放文件夹到本窗口
  23. set LJ=
  24. set /p LJ=
  25. if /i "%LJ%"=="" goto 0
  26. echo.&echo         请输入修改前的后缀名:
  27. set q=
  28. set /p q=
  29. if /i "%q%"=="" goto 0
  30. echo.&echo          请输入修改后的后缀名:
  31. set h=
  32. set /p h=
  33. if /i "%h%"=="" goto 0
  34. for /r %LJ% %%i in (*.%q%) do ren %%i *.%h%
  35. echo.&echo.           后缀名已批量修改成功!
  36. echo.&echo.           请打开文件夹看看吧!
  37. start %LJ%
  38. pause
  39. goto 0
复制代码
这个批处理是我的原创,基本是成功的。

注:这句代码是3楼的
  1. for /r %LJ% %%i in (*.%q%) do ren %%i *.%h%
复制代码
注:这句代码是3楼的

    问题是——
    1、当目标文件夹的路径中有空格和特殊字符时,怎么支持拖放?
    2、怎么同时修改目标文件夹下的所有子目录?
    3、为了避免被搜索发现,我还想更进一步:“在批量修改后缀名的同时,批量修改文件名”。
         比如,我把“C:\Documents and Settings\Administrator\桌面”目录下,所有的“*.lnk”文件,都改为“后缀名全部统一改为abc,文件名则整体颠倒”。
         比如"1234.lnk",改名后就变为“4321.abc”。
         比如"1234.jpg.lnk",改名后就变为“gpj.4321.abc”。
         总之,只认最后一个后缀名为真实后缀名。前面的,全部按文件名处理,整体颠倒!
      
      盼高手解答!!

      预先感谢了!!!

      顿首......


      补充说明——
      1、批处理必须要支持:由用户在批处理的运行窗口,自行输入目标文件夹(或拖放获取路径)、原后缀名和新后缀名。
      2、目标文件夹的路径,有可能含有空格。
           比如“C:\Documents and Settings\Administrator”目录。
      3、目标文件夹的路径,有可能含有汉字。
            比如“C:\Documents and Settings\Administrator\桌面”目录。
      4、目标文件夹的路径,有可能含有特殊字符。
           比如"^"和“&”字符。
      5、批处理必须要支持,对系统或隐藏属性文件的改名。但是,改名后,又必须恢复原来的属性。

[ 本帖最后由 lujice 于 2011-1-23 09:56 编辑 ]
作者: lujice    时间: 2011-1-21 11:49

这个批处理如果用来"禁止使用控制面板",那效果比网上流传的代码,不知好多少......

呵呵呵......
作者: Hello123World    时间: 2011-1-21 12:28

1、当文件夹的路径中有空格和特殊字符时,怎么支持拖放?
  cd %LJ% 改为 cd /d "%LJ%"
   2、如想同时处理文件夹下所有的子目录时,又该怎么写?
  REN *.%q% *.%h% 改为 for /r "%LJ%"  %%i in (*.%q%) do ren %%i %%~ni.%h%
    3、为了避免被搜索发现,我还想更进一步:“在批量修改后缀名的同时,批量修改文件名”。
         即——在文件名的第一个字符和第二个字符中间,加个数字1。
         这又该怎么

[ 本帖最后由 Hello123World 于 2011-1-22 20:07 编辑 ]
作者: lujice    时间: 2011-1-21 12:46

谢谢“Hello123World”了!

再请高手继续完善......
作者: lujice    时间: 2011-1-21 12:57

“Hello123World”,您的修改是错误的!!!

应该改为——

echo.&echo          请输入修改后的后缀名:
set h=
set /p h=
if /i "%h%"=="" goto 0
for /r %LJ% %%i in (*.%q%) do ren %%i *.%h%
echo.&echo.           后缀名已批量修改成功!
echo.&echo.           请打开文件夹看看吧!

不过,还是不支持空格和特殊字符!

依然谢谢您!!

再请高手继续完善......

[ 本帖最后由 lujice 于 2011-1-21 13:14 编辑 ]
作者: hanyeguxing    时间: 2011-1-21 16:02

改cpl扩展名和禁止使用控制面板是两回事
示例:该不能处理的敏感字符依旧不能处理,支持拖放、支持双击、支持过滤、支持拖放时文件与目录混合
  1. @echo off
  2. set x0=.bat
  3. set x1=.cmd
  4. set c=1
  5. if "%~1"=="" set m==&goto:b
  6. :a
  7. set "a=%~a1"
  8. if "%a:~0,1%"=="-" (set d==) else set d=
  9. if defined d (
  10. if /i "%~x1"=="%x0%" (
  11.         set "a=%~n1%x1%"
  12.         setlocal enabledelayedexpansion
  13.         ren "%~1" "!a:~0,1!%c%!a:~1!"
  14.         endlocal
  15. ) else echo 未处理;"%~1"
  16. )
  17. :b
  18. if not defined m set n="%~1\"
  19. if not defined d for /r %n% %%a in (*) do if /i "%%~xa"=="%x0%" (
  20.         set "a=%%~na%x1%"
  21.         setlocal enabledelayedexpansion
  22.         ren "%%a" "!a:~0,1!%c%!a:~1!"
  23.         endlocal
  24. ) else echo 未处理;"%%a"
  25. if defined m goto:end
  26. shift
  27. if not "%~1"=="" goto:a
  28. :end
  29. echo;完成
  30. pause
复制代码

[ 本帖最后由 hanyeguxing 于 2011-1-21 16:03 编辑 ]
作者: lujice    时间: 2011-1-21 17:57     标题: 谢谢“hanyeguxing”版主

一、我现在才发现插入代码的编辑按钮,抱歉了!

二、谢谢版主的代码!!

三、您的批处理对拖放的支持很好,同时处理子目录。不过,您的批处理不支持双击。只要一双击,就马上处理批处理所在目录及其子目录,动作是——
   1、 改后缀名;
   2、文件名插入字符。
   这与我的期望不一样。问题有——
   1、应该支持双击;
   2、应该支持在批处理窗口,自行输入路径、原后缀名、新后缀名、待插入字符;
   3、还差一段删除插入字符的代码(即还原)
作者: hanyeguxing    时间: 2011-1-21 18:06

要想指定双击后的路径,把 if "%~1"=="" set m==&goto:b 改成
if "%~1"=="" (
set m==
set/p n=路径
goto:b
)
原后缀名、新后缀名、待插入字符;在最开始的3个set改成set/p
删除的例如:ren "%%a" "!a:~0,1!!a:~2!"
作者: lujice    时间: 2011-1-21 18:18

原帖由 hanyeguxing 于 2011-1-21 18:06 发表
要想指定双击后的路径,把 if "%~1"=="" set m==&goto:b 改成
if "%~1"=="" (
set m==
set/p n=路径
goto:b
)
原后缀名、新后缀名、待插入字符;在最开始的3个set改成set/p
删除的例如:ren "%%a" "!a:~0,1!! ...

  1. ren "%%a" "!a:~0,1!!a:~2!"
复制代码


学了一招!!谢谢!!

唉!还是回去啃论坛的教程帖子吧!
作者: lujice    时间: 2011-1-21 18:30

版主,您的代码Bug不少啊!

还是我自己慢慢琢磨解决吧!

谢谢你给了我加、删字符的方法!
作者: BillGates    时间: 2011-1-21 19:55

很郁闷啊,我很多个文件是这样的(写批量命名失败的结果)
*.doc.docx
想命名到doc但是会变成*.doc.docx.doc怎么解决呀。
作者: hanyeguxing    时间: 2011-1-21 20:56     标题: 回复 10楼 的帖子

出现了哪些问题?
作者: lujice    时间: 2011-1-22 10:17     标题: 回“寒夜孤星”

比如,用户不想插入字符时,变量"C"不输入字符直接回车......

比如,双后缀名、多后缀名文件......

比如,我用批处理窗口的“标记——粘贴”功能,输入待插入字符为汉字......

[ 本帖最后由 lujice 于 2011-1-22 13:58 编辑 ]
作者: lujice    时间: 2011-1-22 13:25

奇怪!
建立回收站怎么又支持空格、和特殊字符?
  1. @echo off
  2. :0
  3. cls
  4. echo.
  5. echo.               ╭────────╮
  6. echo.     ╭────┤  使 用 说 明   ├────╮
  7. echo.     │        ╰────────╯        │
  8. echo.     │                                    │
  9. echo.     │   1、本工具的用途是——在指定目录  │
  10. echo.     │      里,建立回收站。              │
  11. echo.     │                                    │
  12. echo.     │   2、每一步输入完毕,都请敲回车!  │
  13. echo.     │                                    │
  14. echo.     │   3、支持文件夹的名字和路径中含有  │
  15. echo.     │      空格和特殊字符!              │
  16. echo.     │                                    │
  17. echo.     │   3、手打输入文件夹的名字和路径、  │
  18. echo.     │      和回收站的名字时,请在前后    │
  19. echo.     │      加上英文的双引号——"         │
  20. echo.     │                                    │
  21. echo.     ╰──────────────────╯
  22. echo.&echo      请输入文件夹的路径,或拖放文件夹到本窗口
  23. set mulu=
  24. set /p mulu=
  25. echo.&echo         请输入回收站的名字:
  26. set /p minzi=
  27. md %mulu%\%minzi%>nul 2>nul
  28. attrib +s +h %mulu%\%minzi%>nul 2>nul
  29. (echo [.ShellClassInfo]
  30. echo CLSID={645FF040-5081-101B-9F08-00AA002F954E})>%mulu%\%minzi%\desktop.ini
  31. attrib +s +h %mulu%\%minzi%\desktop.ini
  32. echo.&echo.         回收站已建立成功!
  33. echo.&echo.         手工打开看看吧!
  34. echo.
  35. pause
  36. goto 0
复制代码

[ 本帖最后由 lujice 于 2011-1-22 13:55 编辑 ]
作者: hanyeguxing    时间: 2011-1-22 15:59

除了说路过,我已经彻底无语了。。。
作者: lujice    时间: 2011-1-22 18:34

呵呵,我这个菜鸟好笨啊!!看不懂带for的语句,看不懂如何插入、与删除字符......

算了,给我一个成品吧!



挑战——批量修改后缀名、并同时颠倒文件名
   
      批处理的用途是——
      1、把目标文件夹(包含它的所有子目录)里,某类指定后缀名的文件,批量的修改为其它指定的后缀名。
      2、同时,把目标文件夹(包含它的所有子目录)里,某类指定后缀名的文件,批量的颠倒文件名。
      

      补充说明——
      1、批处理必须要支持:由用户在批处理的运行窗口,自行输入目标文件夹(或拖放获取路径)、原后缀名和新后缀名。
      2、目标文件夹的路径,有可能含有空格。
           比如“C:\Documents and Settings\Administrator”目录。
      3、目标文件夹的路径,有可能含有汉字。
            比如“C:\Documents and Settings\Administrator\桌面”目录。
      4、目标文件夹的路径,有可能含有特殊字符。
           比如"^"和“&”字符。
      5、具体改名的例子是:
           比如"1234.原后缀名",改名后就变为“4321.新后缀名”
      6、双后缀名的情况是:
           比如"1234.jpg.原后缀名",改名后就变为“gpj.4321.新后缀名”。
           总之,只认最后一个后缀名为真实后缀名。前面的,全部按文件名处理,整体颠倒!
      7、批处理必须要支持,对系统或隐藏属性文件的改名。但是,改名后,又必须恢复原来的属性。

[ 本帖最后由 lujice 于 2011-1-22 19:16 编辑 ]
作者: tmplinshi    时间: 2011-1-22 21:32

  1. @echo off
  2. :Input_Folder
  3.     echo 请输入文件夹路径(或拖放文件夹到本窗口):
  4.     set Folder=
  5.     set /p Folder=   
  6.    
  7.     if not defined Folder goto Input_Folder
  8.     if not exist "%Folder:"=%" (
  9.         echo * 错误:不存在该文件夹
  10.         goto Input_Folder
  11.     )
  12. :Input_OldExt
  13.     set OldExt=
  14.     set /p OldExt=请输入原后缀名:
  15.    
  16.     if not defined OldExt goto Input_OldExt
  17. :Input_NewExt
  18.     set NewExt=
  19.     set /p NewExt=请输入新后缀名:
  20.    
  21.     if not defined NewExt goto Input_NewExt
  22. rem 去除路径中的引号、后缀中的“.”及前面的字符
  23. set "Folder=%Folder:"=%"
  24. set "OldExt=%OldExt:*.=%"
  25. set "NewExt=%NewExt:*.=%"
  26. for /f "delims=" %%i in ('dir /a:-d /b /s "%Folder%\*.%OldExt%"') do (
  27.     set fPath=%%~dpi
  28.     set fName=%%~ni
  29.     set fAttr=%%~ai
  30.     SetLocal EnableDelayedExpansion
  31.    
  32.     rem 判断有没有“系统”和“隐藏”属性,有则去除
  33.     set AttrList=
  34.     if "!fAttr:s=!" neq "!fAttr!" set AttrList= s
  35.     if "!fAttr:h=!" neq "!fAttr!" set AttrList=!AttrList! h
  36.     if defined AttrList (
  37.         attrib !AttrList: = -! "!fPath!!fName!.!OldExt!"
  38.     )
  39.    
  40.     rem 计算文件名的字符个数
  41.     set /a n = 8189, b = 0
  42.     for /l %%a in (1 1 13) do (
  43.         set /a "a = (n - b) / 2 + b"
  44.         for %%b in (!a!) do (
  45.             if "!fName:~%%b,1!"=="" (set n=!a!) else set b=!a!
  46.         )
  47.     )
  48.    
  49.     rem 颠倒文件名
  50.     set /a n -= 1
  51.     for /l %%n in (0 1 !n!) do (
  52.         set NewName=!fName:~%%n,1!!NewName!
  53.     )
  54.    
  55.     rem 重命名
  56.     ren "!fPath!!fName!.!OldExt!" "!NewName!.!NewExt!"
  57.    
  58.     rem 如果之前修改了文件属性,则改回去
  59.     if defined AttrList (
  60.         attrib !AttrList: = +! "!fPath!!NewName!.!NewExt!"
  61.     )
  62.    
  63.     EndLocal
  64. )
复制代码

[ 本帖最后由 tmplinshi 于 2011-1-23 10:23 编辑 ]
作者: lujice    时间: 2011-1-23 09:54     标题: 感谢tmplinshi 老大!!

试验了!目前还没有发现Bug!!

这个工具,用于禁止(恢复)计算机某些功能的执行。比如禁止(恢复)“我的电脑——右键——管理”、比如禁止(恢复)“文件夹选项”、比如禁止(恢复)控制面板的所有项目、比如禁止(恢复)组策略、比如禁止(恢复)注册表......

呵呵!这种禁止方法,别人还能轻易破解吗???

万分感谢tmplinshi 老大!!

马上回去,抱起论坛的教程,慢慢咀嚼tmplinshi 老大的代码......

再次感谢tmplinshi 老大!!
作者: lujice    时间: 2011-1-23 10:09

虽然我是一个不折不扣的菜鸟,只会最简单的命令。但是,我敢于尝试......

过两天,我会发一个U盘病毒免疫批处理。有一点原创的DIY,就是加一个把隐私文件藏进去的功能,再加强下防删除、防更名的能力。

高手就不看了,全是用简单命令写的语句。

回去抠脑壳吧!




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2