Board logo

标题: [文件操作] 修改批处理BAT代码:给子目录文件夹重命名 [打印本页]

作者: lzyecho    时间: 2014-2-25 14:22     标题: 修改批处理BAT代码:给子目录文件夹重命名

大家好,又来学习了,请教帮忙修改代码:
我要给当前目录里的文件夹及其子目录(文件夹)重命名,而不影响里面的文件。但是下面的两个代码只能给当前批处理所在的文件夹命名了,而对下层子目录(文件夹)无效,请帮忙给看看。
第一种:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims="  %%i in ('dir /ad/b') do (
  4. set /a num+=1      
  5. ren "%%i" "!num!%%i"               
  6. )
  7. echo 处理完毕!按任意键结束。
  8. pause>NUL
复制代码
问题是:代码中 dir /ad/b又不能加参数 /s ,提示说是语法错误??
第二种:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /r  %%i in (.) do (
  4. ren "%%i" "!num!%%~ni"
  5. set /a num+=1
  6. ) 2>NUL
  7. echo 处理完毕!按任意键结束。
  8. pause>NUL
复制代码

作者: DAIC    时间: 2014-2-25 15:47

问题是:代码中 dir /ad/b又不能加参数 /s ,提示说是语法错误??

语法错误应该不是 /s 参数的原因。
以这个目录为例:
C:\test\folder
你的代码会先把 C:\test 重命名成 C:\1test
然后再尝试重命名 C:\test\folder,因为 test 文件夹已经不存在了,所以出错。
作者: apang    时间: 2014-2-25 15:59

http://www.bathome.net/thread-28415-1-10.html
楼主不长记性
dir 加上参数 /s 以后,列举出来的文件会包含驱动器和路径,新文件名 "!num!%%i" 中已经包含驱动器和路径了,所以报“语法错误”
作者: lzyecho    时间: 2014-2-25 19:51

本帖最后由 lzyecho 于 2014-2-25 20:02 编辑

回复 3# apang


   首先, 感谢apang的指点,诚恳接受批评。 你给看看,我下面的修改是否可以?  我在dir /ad/b/s 加了参数/s 之后,再在后面命名中把  ren "%%i" "!num!%%i" 改为 ren "%%i" "!num!%%~ni" ,利用变量扩展屏蔽了路径,这样执行的结果是 没有再出现语法错误的提示,可以执行了,重命名也成功了,但是又有了新的提示:系统找不到文件!不知是何原因,是不是我的变量扩展没写对%%~ni   ,这里的n我想指的文件名,但是又在变量扩展中找不相应的字母,因此我用文件名的扩展,不知是否正确,执行的结果虽然是重命名了,但出现了我上面所说的错误提示,请明示原因。另外,虽然加了参数/S,但是仍然没有对子目录中的文件夹重命名,再请您分析原因,谢谢。
第二,我的目的是想对多级子目录中的文件夹重命名,请大家在我上面的代码上给指点迷津或指出更好的方法。再谢大家。
作者: apang    时间: 2014-2-25 20:53

回复 4# lzyecho


    2楼DAIC已经给你答案了,你仔细琢磨就会明白
顶楼代码可以这样改:
  1. @echo off
  2. for /f "delims="  %%i in ('dir /ad/b/s^|sort /r') do (
  3.     set /a num+=1
  4.     set "file=%%i" & set "name=%%~nxi"
  5.     setlocal enabledelayedexpansion
  6.     ren "!file!" "!num!!name!"
  7.     endlocal               
  8. )
  9. echo 处理完毕!按任意键结束。
  10. pause>NUL
复制代码

作者: lzyecho    时间: 2014-2-25 22:14

回复 5# apang


    感谢回复 !!,我试了您的代码,发现是把当前目录的文件夹与子目录里的文件夹混合起来按数字序列命名的。这不是理想结果,我想要的是每一级目录中的文件夹都是按数字序列从1开始命名。不知能不能做到?
作者: 煎饼    时间: 2014-2-26 17:13

学习了,这个很实用
作者: apang    时间: 2014-2-26 19:44

回复 6# lzyecho


    是不是想要这样?
  1. @echo off
  2. for /f "delims=" %%a in ('dir /ad/b/s^|sort /r') do (
  3.     set "file=%%a" & set "name=%%~nxa"
  4.     setlocal enabledelayedexpansion
  5.     set "f=!file:%~dp0=!"
  6.     for %%b in ("!f:\=" "!") do set /a n+=1
  7.     echo,ren "!file!" "!n!!name!"
  8.     endlocal
  9. )
  10. pause
复制代码

作者: lzyecho    时间: 2014-2-26 22:59

回复 8# apang


    您好,这个代码还是由最内层到最外按数字序列命名的。我的意思是要每一级的目录里的多个文件夹都 是按1、2、3、、、命名的,不同目录里的文件夹没有联系的。再次感谢您。
另外 ,编写代码时 何时要用到变量增加扩展的格式,有没有相应的文章或教程,烦请您介绍一下。
作者: apang    时间: 2014-2-27 11:16

回复 9# lzyecho


    不明白你说的“每一级目录”是个什么概念
你已经从“修改代码”变成“求代码”了,自己慢慢求去吧
作者: DAIC    时间: 2014-2-27 14:52

编写代码时 何时要用到变量增加扩展的格式,有没有相应的文章或教程

http://bbs.bathome.net/thread-2899-1-1.html
作者: DAIC    时间: 2014-2-27 15:05

回复 9# lzyecho
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "PathLast="
  4. set "NumCounter="
  5. for /f "delims=" %%a in ('dir /ad /b /s ^| sort /r') do (
  6.     set "file=%%a"
  7.     set "name=%%~nxa"
  8.     set "PathThis=%%~dpa"
  9.     if !PathThis! neq !PathLast! (
  10.         set "NumCounter=0"
  11.     )
  12.     set /a NumCounter+=1
  13.     set "f=!file:%~dp0=!"
  14.     ren "!file!" "!NumCounter!!name!"
  15.     set "PathLast=%%~dpa"
  16. )
复制代码

作者: lzyecho    时间: 2014-2-27 17:09

回复 10# apang


    因为本人对批处理还在初级阶段,只是在表面上编一些简单的代码,希望apang 不要介意,依然感谢你的热心帮助。
作者: lzyecho    时间: 2014-2-27 17:09

回复 12# DAIC


    感谢DAIC给的学习教程及修改后的代码,很实用!!本论坛是我们这些新手学习的好地方,我会经常来报道的。
作者: terse    时间: 2014-2-27 17:13

用临时文件过度下
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "skip=2 tokens=*" %%i in ('dir /s /ad') do (
  3.     set "str=%%i"
  4.     if exist "!str:~,-4!\" (
  5.        set "files=!str:~,-4!"&set n=0
  6.     ) else for /f "tokens=*" %%a in ("!str:*>=!") do (
  7.                if exist "!files!\%%~nxa\" if "%%~nxa" neq "" (
  8.                      set /an+=1
  9.                      echo ren "!files!\%%a" "!n!%%a"   
  10.                   )
  11.                )
  12. ))>$
  13. sort /r $>Ren_files.cmd
  14. call Ren_files.cmd
  15. del $ Ren_files.cmd
  16. pause
复制代码

作者: terse    时间: 2014-2-27 17:40

这样省略临时文件
  1. @echo off&setlocal enabledelayedexpansion
  2. %1(for /f "tokens=*" %%i in ('%~s0 :^|sort /r') do ren %%i)&pause&exit
  3. for /f "tokens=*" %%i in ('dir /ad /b /s') do (
  4.     set "file=%%i"
  5.     set "str1=%%~dpi"
  6.     if "!str1!" neq "!str2!" (
  7.        set "n=1"
  8.     ) else set /a n+=1
  9.       echo "!file!" "!n!_%%~nxi"
  10.       set "str2=%%~dpi"
  11. )
复制代码

作者: lzyecho    时间: 2014-2-27 21:37

回复 16# terse


      terse ,您好 ,你的代码完美解决了我的问题,第二个代码更简洁!只是对我来说太深了,看不大懂,特别是 这一句  %1(for /f "tokens=*" %%i in ('%~s0 :^|sort /r') do ren %%i)  ,用了参数%1。若有时间麻烦给我逐行解释一下你的设计思路及代码含义,先谢了。
作者: DAIC    时间: 2014-2-28 09:14

回复 17# lzyecho


http://www.bathome.net/viewthread.php?tid=28866#pid144656




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