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

[文件操作] 修改批处理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
复制代码

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

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

TOP

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

TOP

本帖最后由 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,但是仍然没有对子目录中的文件夹重命名,再请您分析原因,谢谢。
第二,我的目的是想对多级子目录中的文件夹重命名,请大家在我上面的代码上给指点迷津或指出更好的方法。再谢大家。

TOP

回复 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
复制代码

TOP

回复 5# apang


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

TOP

学习了,这个很实用

TOP

回复 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
复制代码

TOP

回复 8# apang


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

TOP

回复 9# lzyecho


    不明白你说的“每一级目录”是个什么概念
你已经从“修改代码”变成“求代码”了,自己慢慢求去吧

TOP

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

http://bbs.bathome.net/thread-2899-1-1.html

TOP

回复 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. )
复制代码

TOP

回复 10# apang


    因为本人对批处理还在初级阶段,只是在表面上编一些简单的代码,希望apang 不要介意,依然感谢你的热心帮助。

TOP

回复 12# DAIC


    感谢DAIC给的学习教程及修改后的代码,很实用!!本论坛是我们这些新手学习的好地方,我会经常来报道的。

TOP

用临时文件过度下
  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
复制代码

TOP

返回列表