Board logo

标题: [文件操作] [已解决]批处理不能重命名带感叹号打头的文件名? [打印本页]

作者: xieqingx    时间: 2010-4-6 02:35     标题: [已解决]批处理不能重命名带感叹号打头的文件名?

测试发现,不能重命名带感叹号打头的文件名,怎么解决呢
--------------------------------------------------------------------
接受了namejm指导后,发布小小代码
我为什么不能在原创代码版块贴代码呢?等级不够吗?那我只能发这里了
代码功能:生成右键菜单,不要使用时可以卸载。在须处理的文件夹右键调用批处理,可对右键指定文件夹内的文件批量重命名为30个随机字母加数字,可根据要求修改文件名长度
代码中 if !n! lss 30  其中30为文件名字符长度,可随意按自已要求修改
  1. @echo off
  2. title [右键重命名文件程序]
  3. mode con: cols=58 lines=12
  4. color 6f
  5. if not exist %systemroot%\batchRen.bat ( goto install) else ( goto next)
  6. :install
  7. echo.&echo   正在添加右键功能....&echo.
  8. cd.>%systemroot%\batchRen.bat
  9. >>%systemroot%\batchRen.bat echo @echo off
  10. >>%systemroot%\batchRen.bat echo title [右键重命名文件程序]
  11. >>%systemroot%\batchRen.bat echo mode con: cols=65 lines=30
  12. >>%systemroot%\batchRen.bat echo color 6f
  13. >>%systemroot%\batchRen.bat echo echo  [code by xieqingx 20100405 blog: hi.baidu.com/xieqingx]
  14. >>%systemroot%\batchRen.bat echo set code=abcdefghijklmnopqrstuvwxyz0123456789
  15. >>%systemroot%\batchRen.bat echo setlocal enabledelayedexpansion
  16. >>%systemroot%\batchRen.bat echo cd /d %%1
  17. >>%systemroot%\batchRen.bat echo for /f "delims=" %%%%i in ('dir /a-d/b') do (
  18. >>%systemroot%\batchRen.bat echo set /a filenum+=1
  19. >>%systemroot%\batchRen.bat echo call :int "%%%%~fi" "%%%%~xi" !filenum! )
  20. >>%systemroot%\batchRen.bat echo echo   操作完成,正在关闭窗口....
  21. >>%systemroot%\batchRen.bat echo ping -n 5 127.1 ^>nul^&exit
  22. >>%systemroot%\batchRen.bat echo :int
  23. >>%systemroot%\batchRen.bat echo set str=^&set n=
  24. >>%systemroot%\batchRen.bat echo set name=%%~1
  25. >>%systemroot%\batchRen.bat echo set ext=%%~2
  26. >>%systemroot%\batchRen.bat echo set fnum=%%~3
  27. >>%systemroot%\batchRen.bat echo :begin
  28. >>%systemroot%\batchRen.bat echo set /a a=%%random%%%%%%35
  29. >>%systemroot%\batchRen.bat echo set var=!code:~%%a%%,1!^&set str=!str!!var!
  30. >>%systemroot%\batchRen.bat echo set /a n+=1
  31. >>%systemroot%\batchRen.bat echo if !n! lss 30  ( goto begin) else ( set /a num+=1 )
  32. >>%systemroot%\batchRen.bat echo if !num! == !fnum! (  
  33. >>%systemroot%\batchRen.bat echo echo 正在重命名"!name!"文件
  34. >>%systemroot%\batchRen.bat echo ren "!name!" "!str!!ext!"
  35. >>%systemroot%\batchRen.bat echo echo 已更名为"!str!!ext!"
  36. >>%systemroot%\batchRen.bat echo echo.-----------------------------------------------
  37. >>%systemroot%\batchRen.bat echo ) else (
  38. >>%systemroot%\batchRen.bat echo set num=
  39. >>%systemroot%\batchRen.bat echo )
  40. >>%systemroot%\batchRen.bat echo set str=^&set n=
  41. reg add "HKCR\Directory\shell\batchRen" /ve /d "指定目录中所有子文件批量改名(&R)" /f >nul
  42. reg add "HKCR\Directory\shell\batchRen\command" /ve /d "%systemroot%\batchRen.bat %%1" /f >nul
  43. reg add "HKCR\Directory\shell\batchRen\command" /d 1  /v "check" /f >nul
  44. echo   添加完毕,现在你可以使用右键菜单,请用右键操作文件夹,&echo.  
  45. echo   选择 "指定目录中所有子文件批量改名(&R)" 的菜单项&echo.
  46. echo   可以对你右键指定目录中的子文件来进行重命名操作了&echo.
  47. echo   卸载成功,正在关闭窗口....
  48. ping -n 8 127.1 >nul&exit
  49. :next
  50. echo.
  51. echo                你要卸载此右键菜单功能吗?            
  52. echo.
  53. echo                  Y、是的,我不想要了
  54. echo.
  55. echo                  N、不,我要退出程序
  56. echo.
  57. set choice=
  58. set /p choice=                请输入指定功能代码(Y/N):
  59. echo.
  60. if not defined choice cls&goto next
  61. set "choice=%choice:~0,1%"
  62. if /i "%choice%"=="N" ( exit ) else (if /i "%choice%"=="Y" ( goto unload) else ( cls&&echo.&echo.&echo.&echo.&echo.&echo
  63.                请输入正确选项&ping -n 4 127.1>nul&cls&&goto :next))
  64. :unload
  65. del %systemroot%\batchRen.bat
  66. reg delete "HKCR\Directory\shell\batchRen" /f >nul
  67. echo                卸载成功,正在关闭窗口....
  68. ping -n 4 127.1 >nul&exit
复制代码

[ 本帖最后由 xieqingx 于 2010-4-10 00:13 编辑 ]
作者: Batcher    时间: 2010-4-6 09:33

为何无法在某些版块发帖?
http://bbs.bathome.net/thread-2128-1-1.html

参考:各用户组拥有的权限一览
http://bbs.bathome.net/thread-1869-1-1.html
作者: terse    时间: 2010-4-6 11:21

为什么不用  For /l ....    而要 goto?
作者: xieqingx    时间: 2010-4-9 20:25     标题: [已解决]请问如何显示带 ! 号的文件

请问如何显示带 ! 号的文件,它会忽略感吧号,所以要重命名操作时会失败
  1. @echo off
  2. for %%i in (*) do echo %%i
  3. pause
复制代码

[ 本帖最后由 xieqingx 于 2010-4-10 00:11 编辑 ]
作者: hanyeguxing    时间: 2010-4-9 20:42

  1. @echo off
  2. for %%a in (*.txt) do (set "a=%%a"
  3. setlocal enabledelayedexpansion
  4. echo.!a!
  5. endlocal)
  6. pause
复制代码

作者: xieqingx    时间: 2010-4-9 21:44

2楼的没错,我要问的其实是这个问题
以下代码功能是:重命名指定当前文件夹中所有子文件名的这个代码,遇到带!号的子文件名,会出错代码无法执行,就是因为这个引起的,不知道如何解决
  1. @echo off
  2. color 6f
  3. echo  [code by xieqingx 20100405 blog: hi.baidu.com/xieqingx]
  4. set code=abcdefghijklmnopqrstuvwxyz0123456789
  5. setlocal enabledelayedexpansion
  6. set /p cdr=  请输入当前目录中要重命名所有子文件的文件夹
  7. cd /d %cdr%
  8. for /f "delims=" %%i in ('dir /a-d/b') do (
  9. set /a filenum+=1
  10. call :int "%%~fi" "%%~xi" !filenum! )
  11. echo   操作完成,正在关闭窗口....
  12. pause >nul&exit
  13. :int
  14. set str=&set n=
  15. set name=%~1
  16. set ext=%~2
  17. set fnum=%~3
  18. :begin
  19. set /a a=%random%%%35
  20. set var=!code:~%a%,1!&set str=!str!!var!
  21. set /a n+=1
  22. if !n! lss 30  ( goto begin) else ( set /a num+=1 )
  23. if !num! == !fnum! (  
  24. echo 正在重命名"!name!"文件
  25. ren "!name!" "!str!!ext!"
  26. echo 已更名为"!str!!ext!"
  27. echo.-----------------------------------------------
  28. ) else (
  29. set num=
  30. )
  31. set str=&set n=
复制代码

作者: xieqingx    时间: 2010-4-9 21:50

右键重命名代码
测试发现,不能重命名带感叹号打头的文件名,怎么解决呢
还有可否精简提高效率呢
  1. @echo off
  2. mode con: cols=65 lines=30
  3. color 6f
  4. set code=abcdefghijklmnopqrstuvwxyz0123456789
  5. setlocal enabledelayedexpansion
  6. cd /d %1
  7. for /f "delims=" %%i in ('dir /a-d/b') do (
  8. set /a filenum+=1
  9. call :int "%%~fi" "%%~xi" !filenum! )
  10. echo   操作完成,正在关闭窗口....
  11. ping -n 5 127.1 >nul&exit
  12. :int
  13. set str=&set n=
  14. set name=%~1
  15. set ext=%~2
  16. set fnum=%~3
  17. :begin
  18. set /a a=%random%%%35
  19. set var=!code:~%a%,1!&set str=!str!!var!
  20. set /a n+=1
  21. if !n! lss 50  ( goto begin) else ( set /a num+=1 )
  22. if !num! == !fnum! (  
  23. echo 正在重命名"!name!"文件
  24. ren "!name!" "!str!!ext!"
  25. echo 已更名为"!str!!ext!"
  26. echo.-----------------------------------------------
  27. ) else (
  28. set num=
  29. )
  30. set str=&set n=
复制代码

[ 本帖最后由 xieqingx 于 2010-4-9 22:11 编辑 ]
作者: hanyeguxing    时间: 2010-4-9 22:30

1,在for里加setlocal enabledelayedexpansion,完成前加endlocal
2,我在2楼里已经写了示例.
3,不要重复发贴.

[ 本帖最后由 hanyeguxing 于 2010-4-9 23:22 编辑 ]
作者: xieqingx    时间: 2010-4-9 22:52

我试了N次了,还是不行啊,水平有限,麻烦测试一下吧
作者: 随风    时间: 2010-4-9 22:53

提问首先应学会裁剪你的代码,把成吨的代码搬上来,没几个人有时间和耐心看的
要知道,看别人的代码比自己写代码要累N倍
一般不要用代码来说明你的问题,因为你的代码很有可能会把别人引入歧途,所以尽量用文字描述你的问题或代码意图。
作者: xieqingx    时间: 2010-4-9 22:59

问题是用简化代码测试是没有问题的,

  1. @echo off
  2. for /f "delims=" %%a in ('dir /b') do (
  3. set "a=%%a"
  4. setlocal enabledelayedexpansion
  5. echo ren !a! %random%
  6. endlocal)
  7. pause
复制代码

这段简化码是正确的
但是我的代码,按这个修改CALL :int后就是不行
弄不懂啊,哪位就帮帮我吧,刚学这个不久啊。测试一下吧

[ 本帖最后由 xieqingx 于 2010-4-9 23:04 编辑 ]
作者: hanyeguxing    时间: 2010-4-9 23:15

  1. @echo off&color 6f&set c=0123456789abcdefghijklmnopqrstuvwxyz
  2. set/p d=  请输入当前目录中要重命名所有子文件的文件夹
  3. cd /d %d%
  4. for /f "delims=" %%a in ('dir /b/a-d') do (set "a=%%a"&set "b=%%~na"
  5. setlocal enabledelayedexpansion
  6. echo.正在重命名"!a!"文件
  7. for /l %%i in (1,1,36) do set/a n=!random!%%36&call set i=!i!%%c:~!n!,1%%
  8. ren "!a!" "!i!%%~xa"
  9. echo.已更名为"!i!%%~xa"
  10. echo.-----------------------------------------------
  11. endlocal)
  12. echo   操作完成,等待关闭窗口....&pause >nul&goto :eof
复制代码

按你3楼提供的代码改的
color 6f你这颜色设置得真是没话说...

[ 本帖最后由 hanyeguxing 于 2010-4-9 23:25 编辑 ]
作者: hanyeguxing    时间: 2010-4-9 23:36

发重复了......郁闷......

[ 本帖最后由 hanyeguxing 于 2010-4-9 23:37 编辑 ]
作者: hanyeguxing    时间: 2010-4-9 23:38

不要重复发贴:都害我发错地方了.......................
http://bbs.bathome.net/thread-7553-1-1.html
作者: xieqingx    时间: 2010-4-10 00:11

好,简洁高效。我什么时候才能学到你这水平啊

谢谢
作者: xieqingx    时间: 2010-4-10 00:13

谢谢,你,做我师傅了




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