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

[文件操作] 批处理如何处理指定目录之外的其余目录及文件?

假设我的目录结构是:
project
   .svn
     a.prt.1
     b.prt.2
     c.prt.3
   base.asm.5
   base.asm.6
   com
     i.crw.8
     j.crw.9

我想用一个For来调用一个subrename子程序,所有.svn目录里的文件都不处理,其他的所有文件(包括所有子目录里的)都处理,即需要处理:
base.asm.5
base.asm.6
i.crw.8
j.crw.9

这个批处理应该怎么写呢?盼高手指教!非常感谢!
目前参考2楼、3楼的回复,未能达到期望效果。。。

源bat是这个:http://sharptechdesign.com/Utilities/Renumber_Bat.htm

用途是:在使用ProE的过程中,会产生后缀随保存次数而顺序递增的数值后缀,比如a.prt.1、a.prt.2、a.prt.3……
而要想与SVN结合使用,需要将最后一个a.prt.n重命名为a.prt.1,替换掉当前的a.prt.1
一个ProE工程中,可能会有好几层目录,会包含许多类似这样的文件

我的困惑是(双击运行ProReNumber.bat时):
1. 第10行,call :subrenumber "%1",最后会执行到第88行
  1. :complete
  2. pause
  3. echo.
复制代码

那这个时候批处理不是应该退出了吗?还会继续执行第11行吗?为什么呢?

2. 怎么只是第13行出现了goto:eof呢?这个语句不是应该成对出现的吗?它在这里出现的作用是什么呢?

3. time /t  这个一直出现,只是显示时间,但如果@echo off的话,这语句起什么作用呢?看不出来,是不是只是为了调试方便?

4. 假定我在ProE工程目录下双击运行ProReNumber.bat,工程目录下包含许多个子目录、子子目录等,每个子目录、子子目录下都会包含.svn目录,而我希望bat会递归重命名工程目录下的所有的文件,包括子目录、子子目录等里的文件,但所有的.svn目录下的文件都不要处理。
那么,看上去,第10行调用subrenumber时,只是递归重命名当前目录(即根目录)下的文件。然后运行到11行的For时,才进入到各层子目录去调用subrenumber来处理。是不是这样呢?
如果是这样,那我是不是同时要修改第11行的For和27行的For,让它不处理.svn目录呢?该修改成怎样呢?
第11行蛮奇怪的,For /D /R,百度搜得的结果看上去/R参数就已经“从当前目录或指定目录开始,深入所有子目录”了,那为何还要加/D参数呢?

5. 不懂第11行的For会怎样循环到退出? In (*.*)表示什么意思?

下面粘出这些代码:
  1. title ProReNumber
  2. if !"%1"==! goto :nopath
  3. if not exist %1*.* goto :badpath
  4. path="C:\ProeWildfire3.0\bin"
  5. :start
  6. time /t
  7. call :subrenumber "%1"
  8. FOR /D /R %%d IN (*.*) do call :subrenumber "%%d"
  9. time /t
  10. goto:eof
  11. :subrenumber
  12. cd /d "%1"
  13. echo Changing Attributes.. %1
  14. IF EXIST *.* attrib -R -H *.*
  15. time /t
  16. echo Purging.............. %1
  17. call purge.bat
  18. time /t
  19. echo Renumbering.......... %1
  20. for /F "tokens=1,2,3 delims=. " %%I in ('dir /b *.asm.* *.prt.* *.drw.* *.frm.* *.gph.* *.win.* *.tbl.* *.sym.*') do (
  21. if %%K GTR 1 Call :ReNameFile %%I %%J %%K
  22. )
  23. time /t
  24. goto :Cleaning
  25. :ReNameFile
  26. if exist %1.%2.%3 ren %1.%2.%3 %1.%2.1
  27. goto :complete
  28. :Cleaning
  29. echo Cleaning............. %1
  30. IF EXIST .* del /q .*
  31. IF EXIST *.als del /q *.als
  32. IF EXIST *.log.* del /q *.log.*
  33. IF EXIST *.inf.* del /q *.inf.*
  34. IF EXIST *.crc.* del /q *.crc.*
  35. IF EXIST *.ref.* del /q *.ref.*
  36. IF EXIST *.ptd.* del /q *.ptd.*
  37. IF EXIST *.tst.* del /q *.tst.*
  38. IF EXIST *.memb.* del /q *.memb.*
  39. IF EXIST *.ers.* del /q *.ers.*
  40. IF EXIST *.info.* del /q *.info.*
  41. IF EXIST *.lst.* del /q *.lst.*
  42. IF EXIST *.ncl.* del /q *.ncl.*
  43. IF EXIST *.shd.* del /q *.shd.*
  44. IF EXIST *.tph.* del /q *.tph.*
  45. IF EXIST *.ger.* del /q *.ger.*
  46. IF EXIST *.m_p.* del /q *.m_p.*
  47. IF EXIST *.plt.* del /q *.plt.*
  48. IF EXIST *.err.* del /q *.err.*
  49. IF EXIST *.xrp del /q *.xrp
  50. IF EXIST trail.txt* del /q trail.txt*
  51. IF EXIST pdm_trl* del /q pdm_trl*
  52. IF EXIST std.out del /q std.out
  53. IF EXIST rename_this_*.* del /q rename_this_*.*
  54. IF EXIST prt????.prt* del /q prt????.prt*
  55. IF EXIST asm????.asm* del /q asm????.asm*
  56. IF EXIST dgm????.dgm* del /q dgm????.dgm*
  57. IF EXIST drw????.drw* del /q drw????.drw*
  58. IF EXIST s2d????.sec* del /q s2d????.sec*
  59. IF EXIST lay????.lay* del /q lay????.lay*
  60. IF EXIST ptcs.txt del /q ptcs.txt
  61. IF EXIST ptcf.cmd del /q ptcf.cmd
  62. goto :complete
  63. :nopath
  64. echo.
  65. echo ERROR - No path provided.
  66. echo.
  67. pause
  68. goto :complete
  69. :badpath
  70. pause
  71. echo.
  72. echo ERROR - "%1" is not a valid path.
  73. echo.
  74. pause
  75. goto :complete
  76. :complete
  77. pause
  78. echo.
复制代码

[ 本帖最后由 okala 于 2011-2-28 09:00 编辑 ]

  1. @echo off
  2. for /f "delims=" %%a in ('dir /s /b "C:\Test\a\project\*.*" ^| findstr /v "\.svn"') do (
  3.     if not exist "%%a\" (
  4.         echo subrename "%%a"
  5.     )
  6. )
  7. pause
复制代码

TOP

  1. @echo off
  2. set "".svn"=="
  3. for /d %%a in (*) do if not defined "%%a" for %%b in ("%%a\*") do echo "%%~fb"
  4. pause
复制代码
1,将所有需要过滤掉的目录名定义为变量
2,不处理当前目录下的文件
3,不处理具有隐藏属性的文件
4,不处理子目录中的子目录
5,批处理位于 project 目录下

[ 本帖最后由 hanyeguxing 于 2011-2-23 18:42 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 3楼 的帖子

从楼主的描述来看,应该是需要处理当前目录下的文件。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

感谢大家的回复帮助!
顶楼已更新

TOP

回复 5楼 的帖子

请把所有的背景描述全部更新到顶楼
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

有高手来帮忙一下吗?谢谢啦!

TOP

仅看标题写的,包含隐藏文件
WMIC fsdir where "drive='c:' and path='\\' and filename<>'windows'" list
一个例子
获取C盘中除WINDOWS的所有文件
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

返回列表