Board logo

标题: [文件操作] 批处理如何删除文件夹中多余目录? [打印本页]

作者: shezhanxi1    时间: 2010-10-15 20:48     标题: 批处理如何删除文件夹中多余目录?

各位大仙你们好!我的这个问题比较繁琐,烦劳热心人帮我编写一个程序来解决下面问题。
我现在手头有一个报表,报表的目录格式如下:
-201001
    |-20100101
                |-5002
                |-5003
                |-5004
                |-5034
                 .....
    |-20100102
      ... ...
其中5002,5003,5004等均为文件夹名称(5002等每个文件夹中有一个文件,且5002,5003,等文件夹中文件不会重名),5002,5003,5004为20100101的子目录,20100101又为201001的子目录,我想通过批处理将5002,5003,...下的文件拷贝至20100101下,然后删除5002,5003,...等文件夹。
----
后注:20100102目录结构同20100101相同,总共能到20101017,这些文件夹要实现的功能与20100101相同,如果能通过批处理一步实现所有文件夹得功能,那就更感谢了!!!!!
作者: broly    时间: 2010-10-15 22:27

放在201001文件夹下运行
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /b/ad') do (
  3.   cd /d "%~dp0%%i"
  4.   for /f "delims=" %%j in ('dir /b/ad') do (
  5.     move /y "!cd!\%%j\*" "!cd!" && rd "!cd!\%%j" /q/s
  6.   )
  7. )
  8. pause
复制代码

作者: hfg1977    时间: 2010-10-15 22:51

我也试了一下:
  1. ::放在与201001同一级目录;
  2. ::只有最底层目录包含文件且只有一个文件;
  3. ::工作流程: 找到那一个文件,移动到到上一级,删除那一个文件原来所在的目录(非空则不删除)
  4. @echo on
  5. for /f "tokens=* delims=" %%a in ('dir/b/s/a-d .\201001\') do (
  6. move "%%a" "%%~dpa.\..\"
  7. rd "%%~dpa"
  8. )
  9. ::pause
复制代码
  1. ::放在与201001同一级目录;
  2. ::只有最底层目录包含文件可以有多个文件件;
  3. ::工作流程: 找到那一个文件,连同和它同级的所有文件\夹移动到到上一级,删除那一个文件原来所在的目录(非空则不删除)
  4. @echo on
  5. for /f "tokens=* delims=" %%a in ('dir/b/s/a-d .\201001\') do (
  6. move "%%~dpa.\*.*" "%%~dpa.\..\"
  7. rd "%%~dpa"
  8. )
  9. ::pause
复制代码

[ 本帖最后由 hfg1977 于 2010-10-15 22:58 编辑 ]
作者: Batcher    时间: 2010-10-15 22:53     标题: 回复 3楼 的帖子

所有的代码都顶格写,这样不太好吧?
作者: hfg1977    时间: 2010-10-15 23:02

RE: 4
在某些情况下一些命令不顶格会出现莫名的错误,
以前遇到过, 除非非常复杂的嵌套,不必追求.
作者: cjiabing    时间: 2010-10-15 23:19     标题: 回复 5楼 的帖子

好喜欢你们的代码,简单有效!~
退格是否真的会在某些情况下发生错误?
我今天郁闷了一天,因为我把以前的代码优化了一下,第一次尝试把它们全部退格了,同时可能还改了一些其他命令,但许多原来执行很正常的命令整体上都出现了错误,害得我不停地测试和修改,真不知道是否与此有关???
从另外一个角度考虑,批处理是以行进行的,同时意味着某些命令以每行第一个字符作为判断,退格与顶格之间的差别在于空格上……
作者: zqz0012005    时间: 2010-10-15 23:48

缩进不会导致错误,至少我写代码这么多年来没遇到过。
作者: cjiabing    时间: 2010-10-15 23:58     标题: 回复 7楼 的帖子

在使用全局变量延迟的时候变量用叹号括起来,但以前我只在部分FOR中用叹号,许多情况下用百分号。刚才我把所有变量(系统变量除外)全部改成叹号又好了,但以前不改也可以正确执行,为啥呢?
作者: zqz0012005    时间: 2010-10-16 00:02

拿代码来
作者: cjiabing    时间: 2010-10-16 00:11     标题: 回复 9楼 的帖子

晕,早已改得面目全非了,现在还在改!~
作者: zqz0012005    时间: 2010-10-16 00:25

那就与7楼无关
作者: shezhanxi1    时间: 2010-10-16 08:06     标题: 非常感谢各位大仙的指教,但是均不能实现我的功能

现在我上传我的文件,烦劳大仙们帮我看看!下载后将txt缀修改为rar,然后解压
作者: netbenton    时间: 2010-10-16 12:01

放到:201001目录下
http://bathome.l3.wuyou.com/view ... amp;page=1#pid62368
作者: Batcher    时间: 2010-10-16 12:24     标题: 回复 5楼 的帖子

Shell的here doc会有问题,但是BAT不会出现你说的问题。
作者: Batcher    时间: 2010-10-16 12:27     标题: 回复 12楼 的帖子

请把它更新到顶楼
作者: netbenton    时间: 2010-10-16 12:32

我从来没有遇到过缩进影响到BAT运行的问题。

cjiabing 能否举个例子,并给出问题代码来看看。
作者: broly    时间: 2010-10-16 15:43

楼主,2L的代码不行,是因为你的文件是跟文件夹重名的。这个你没有事先说清楚。
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /b/ad') do (
  3.   cd /d "%~dp0%%i"
  4.   for /f "delims=" %%j in ('dir /b/ad') do (
  5.     ren "!cd!\%%j" "%%j_" && move /y "!cd!\%%j_\*" "!cd!" && rd "!cd!\%%j_" /q/s
  6.   )
  7. )
  8. pause
复制代码

作者: shezhanxi1    时间: 2010-10-16 17:04     标题: 回复 17楼 的帖子

非常感谢大家,非常感谢Broly,非常感谢批处理论坛!
作者: wc726842270    时间: 2010-10-16 20:45     标题: 回复 8楼 的帖子

当开启全局变量延迟时,FOR中的变量一定要用"!"(我想其它的复合语句也是一样的),而其它的单句中用%或!都可以吧




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