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

[文件操作] [已解决]如何精简复制文件不复制目录并删除子目录的批处理?

总从网上下美剧,弄的当前目录下都是子目录然后才是文件,找个文件很麻烦!写了个P能实现从子目录中把文件都COPY(MOVE)到总目录下,并删除子目录,但本人是小鸟儿,用的是笨法子,希望高手们提供个精巧点的方子,也让小鸟儿们学习学习!!
  1. set mypath=%cd:\=\%
  2. dir/a-d/b/s *.* >12345.txt
  3. For /f %%i in (12345.txt) DO copy %%i %mypath%
  4. dir/ad /b >54321.txt
  5. for /f %%j in (54321.txt) do rd /s /q %%j
  6. cd
  7. ::del 12345.txt 54321.txt %0
  8. pause
复制代码

[ 本帖最后由 鹤冲天 于 2008-6-13 00:31 编辑 ]

总目录  是指的什么目录?当前目录,还是根目录?
技术问题请到论坛发帖求助!

TOP

根据他的意思,应该指的就是 当前目录。

他的原意应该是:“当前目录”下很多子目录,电影文件都在那些子目录里...

TOP

看你的代码是把当前目录下(含子目录)的所有文件都移动到了当前目录
且产生了临时文件,并且效率低下。
以下是把后缀名为  rmvb 和 wma 的视频文件都移动到当前目录,并所有空文件夹的代码
若还需要移动其它后缀名的文件,可以在第一个for里自行添加用空格分开。
未测试。。。建议先测试再使用。。。。
有问题回帖,
:
  1. @echo off
  2. for %%a in (rmvb wma) do set .%%a=a
  3. for /f "delims=" %%a in ('dir/b/s/a-d') do (
  4.    if defined %%~xa (
  5.       if /i not "%%~dpa"=="%cd%\" move "%%a" "%cd%"
  6.     )
  7. )
  8. for /f "delims=" %%a in ('dir/b/s/ad ^|sort /r') do rd "%%a"
  9. pause
复制代码
技术问题请到论坛发帖求助!

TOP

  1. for /f "delims=" %%i in ('dir /ad /b /s^|sort /r') do (move "%%i\*.*" .\ && rd /s /q "%%i")
复制代码
试试这一句

其实没那么复杂的。先用 dir /ad /b /s 列出当前目录下的所有子目录,然后把结果传给 sort /r 倒序排列,然后用 move 移动这文件夹下的所有文件到批处理的所在目录,移完后用 rd 删除,移动跟删除一起来,简单多了

注:代码仅供参考。测试成功,但不保证你那也可以用。不支持自动重命名,如果当前上当存在同名文件,会提示,因为 move 没有加 /y

[ 本帖最后由 lovelymorning 于 2008-6-11 14:58 编辑 ]
1

评分人数

    • 随风: 漂亮,够简洁!PB + 12

TOP

原来当前目录可以这样表示  .\    请问和 %cd%  有什么区别吗? 好像这样当路径有空格时,连引号都可以省略了。
学到。。。
技术问题请到论坛发帖求助!

TOP

  楼主若要得到完美的解决方案,还得把完整的目录结构发出来才行,否则,写出来的代码没有针对性,也就无从解决你的问题了。建议用 tree /f 来列文件目录。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

嘿嘿,就知道在这里发帖能学到东西!:)
顺便抱歉下,语言组织的不是很严密!SORRY!!
re:lovelymorning&随风
没想到可以这样写,感谢5楼以及4楼的代码!!

re:namejm
原目录已经没有了,用偶的P也能把活赶了。我把我试验的目录列了出来。
把所有bat文件复制或移动到当前目录下,并删除子目录及文件。
  1. F:\临时存储空间\TEST\新建文件夹\TEST
  2. │  1.txt
  3. │  
  4. ├─BAT加密
  5. │  │  BATCrypt.DLL
  6. │  │  BAT加密.exe
  7. │  │  test1.bat
  8. │  │  
  9. │  └─zipbat
  10. │          zipbat.bat
  11. │         
  12. ├─ExeScript
  13. │      chinese.xml
  14. │      curmenu.ini
  15. │      ExeScript.chm
  16. │      exescript.exe
  17. │      ExeScript.exe.manifest
  18. │      install.sss
  19. │      script.pe
  20. │      script_silent.pe
  21. │      test2.bat
  22. │      unins000.dat
  23. │      unins000.exe
  24. │      
  25. └─QuickBatch FileCompiler-v2.1.5.0
  26.         quickbfc.chm
  27.         quickbfc.exe
  28.         quickbfd.exe
  29.         Re.txt
  30.         stubc.dll
  31.         stubg.dll
  32.         test3.bat
  33.         test4.bat
  34.         下载说明.htm
复制代码

TOP

5楼代码就可以啊,把move "%%i\*.*" 改为move "%%i\*.bat" 就可以了
技术问题请到论坛发帖求助!

TOP

  5楼的代码确实非常简练,完全可以满足楼主的需要——若不存在同名文件的话。

  另外,如果还想继续精简,还是可以的,不过可精简之处不多,仅仅少写两个字符而已:move 语句后面的 .\ 可以去掉——当 move 语句只带一个路径的时候,默认是把该路径下的文件移动到当前目录下。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

顺便问下,小鸟是不是不能加分???

TOP

返回列表