[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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
复制代码

TOP

回复 16# terse


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

TOP

这样省略临时文件
  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. )
复制代码

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

回复 12# DAIC


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

TOP

回复 10# apang


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

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

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

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

TOP

回复 9# lzyecho


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

TOP

回复 8# apang


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

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

学习了,这个很实用

TOP

回复 5# apang


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

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

返回列表