标题: [文件操作] 调用时间参数移动文件 [打印本页]
作者: zhangwei1982nmg 时间: 2008-11-21 15:59 标题: 调用时间参数移动文件
我想写个批处理。。。
将以时间为名的文件夹(20081010,20081011,20081012。。。。)中的文件a.bmp 移动到统一的文件夹(a)里,b.bmp 移动到统一的文件夹(b)里。。。。。怎么办??
注:
1. 每天都增加一个以时间为名的文件夹 ,夹中含有多个文件如:a , b ,c 。。。。等。都要移动到统一的文件夹里。
2.a ,b 都是代替的,实际是汉字的文件名,但所有文件夹里的名字全都一样。
3.每个文件夹里都有很多文件,大概6-10个,所有文件夹里的文件数相同。
4.最好用粘贴的方法,因为数据不好分辨,如果错了很难还原。
[ 本帖最后由 zhangwei1982nmg 于 2008-12-2 15:51 编辑 ]
作者: wxcute 时间: 2008-11-22 10:34
- @echo off
- ::这样同名文件移动到同一目录下不就重名了
- setlocal enableDelayedExpansion
- for /f "delims=" %%i in ('dir/s/b/a-d^|findstr "2008"') do (
- :addnum
- set/a "%%~ni+=1"
- if not exist "%%~ni\%%~ni!%%~ni!%%~xi" (
- move "%%i" "%%~ni\%%~ni!%%~ni!%%~xi"
- ) else (goto :addnum)
- )
- pause>nul
复制代码
作者: zhangwei1982nmg 时间: 2008-11-26 15:04 标题: 谢谢
谢谢您的回复,不过我太笨,,没有看明白。。能不能多给我解释一下??
你写的代码在批处理中就可以直接用么??
作者: wxcute 时间: 2008-11-26 15:58
你可以先创建一个用于测试的目录,如:测试目录
下面有四个目录:20081010 和 20081011 还有目录 A 和 B,还有文件 MoveBMP.BAT(内容为 2 楼的代码);
上面两个以日期为名的目录下都有 a.bmp 和 b.bmp 两个图片文件。
写成目录树形式:
测试目录
├20081010
│ a.bmp
│ b.bmp
├20081011
│ a.bmp
│ b.bmp
├A
└B
MoveBMP.BAT
创建好后双击运行 MoveBMP.BAT 就可以看到效果了。
作者: 随风 时间: 2008-11-26 21:02
这里要指出2楼代码中的一个不“健康”的地方,在for内部使用标签会在某种情况下出现错误(具体的也说不上
)反正设计合理的代码是不需要在for内部使用标签的。
看楼主的意识是要把当前目录下,所有以纯数字命名的文件夹中的bmp文件按文件名新建文件夹,并把文件移动
到相应的文件夹内,
2楼的代码还有一个不足之处,findstr "2008" 应该是findstr /b "2008"
否则的话 abcd2008efg 这样的文件夹也会被匹配。
并且 dir/s/b/a-d 指定的是文件而不是文件夹,所以该代码应该会不能正确运行。
以下代码未测试。。。- @echo off
- for /f "delims=" %%i in ('dir/b/ad^|findstr "^[0-9]*[0-9]$"') do (
- for /f "delims=" %%a in ('dir/b "%%i\*.bmp"') do (
- if not exist "%%i\%%~na\" md "%%i\%%~na"
- move "%%i\%%~nxa" "%%i\%%~na"
- ))
- pause>nul
复制代码
[ 本帖最后由 随风 于 2008-11-26 21:07 编辑 ]
作者: wxcute 时间: 2008-11-27 12:27 标题: 回复 5楼 的帖子
1、对于 for 内使用标签没有深究过,只知道在多层 for 嵌套时从一层跳到另一层易出错。
我只有一个 for,且没有从 for 内跳转到 for 外,测试时倒没有出过错。
2、随风兄可能理解错了楼主的题意了,随风兄的代码好像是在每个日期目录下为每个文件建立一个目录。楼主的意思是把所有的 a.bmp 都移动到同一个 A 目录中。我在考虑会重名的情况下才用跳转的。不过也是我欠考虑,标签完全可以放在外面来调用。
3、用 findstr "2008" 又是我一个欠考虑的地方。我考虑得比较简单,只考虑了主目录下会有些说明之类的文档。用 findstr /b "2008" 也不行,因为我是一次性列出文件,而不是目录。用 findstr "\\2008" 可能会比我原来好些,但并不能剔除我原来代码中的弊病。
4、我这人毛病多,还爱挑人家毛病。 不要见怪哈。 findstr "^[0-9]*[0-9]$" 可简化 findstr "^[0-9]*$"。
我那个很丑的代码还是可以运行的,因为我是经过测试的。
[ 本帖最后由 wxcute 于 2008-11-27 12:30 编辑 ]
作者: zhangwei1982nmg 时间: 2008-12-1 19:13 标题: 代码可以用。
谢谢 冰疼 老兄了。你的代码我测试的是可以用的。
不过不好意思我忘记说了。
我的文件夹里面文件名不是a,b ,,而是汉字 ,,a,b 的意思是每个文件夹里的文件名字都一样。但不是简单的字母,是汉字词语,而转出的文件夹也最好是汉字,您看怎么修改一下您的代码。我用你说的方法试了,和我想的意思是一样的。
还有最好是用复制的,因为每个文件确切说是图片都是差不多的,所以如果移动错了就很难在转回来了。
谢谢你。
作者: zhangwei1982nmg 时间: 2008-12-1 19:18 标题: 不好意思
不好意思。忘记说了。还有一个。
每个文件夹里面不只两个文件。有很多。大概要6个或以上。但是所有文件夹里的文件数都是相同的。
作者: Batcher 时间: 2008-12-1 19:38 标题: 回复 8楼 的帖子
建议将所有的问题描述全部更新到顶楼,以便他人查看。
作者: wxcute 时间: 2008-12-2 17:31 标题: 我在 2 楼的代码可以处理汉字,但处理有空格的文件会出错。
以下代码标签外置,自动判断是否存在图片同名目录,添加处理空格能力。
还是使用 move,毕竟这样比较快,
非要用 copy 不可的话把 [ move "%~1" "%~n1\%~n1!n!%~x1" ] 这句换成
[ copy "%~1" "%~n1\%~n1!n!%~x1">nul ]- ::使用方法是放在以日期为名的目录的同一目录下双击运行。
- @echo off
- setlocal enableDelayedExpansion
- for /f "delims=" %%i in ('dir/s/b/a-d *.jpg *.bmp^|findstr "\\2008"') do (
- call :Mov "%%i"
- )
- echo 移动完成。按任意键退出……
- pause>nul
- goto :eof
- :Mov
- set n=
- if not exist "%~n1" md "%~n1"
- :addnum
- if not exist "%~n1\%~n1!n!%~x1" (
- move "%~1" "%~n1\%~n1!n!%~x1"
- ) else (
- set/a n+=1
- goto :addnum
- )
复制代码
作者: namejm 时间: 2008-12-2 17:53
看了顶楼的描述,有点云里雾里的感觉,有如下疑问:
1、你这个批处理是每天都要运行一次的吗?
2、如果每天都要运行一次,则每次只需要移动最新文件夹中的文件就可以了吧?
3、如果不是每天都要运行一次,那么,把所有文件夹下的文件复制到统一的文件夹下之后,同名的文件岂不是要被全部覆盖、最后只剩下最后一天的文件?这样一来,扫描每一个以日期命名的文件夹又有什么意义?
作者: zhangwei1982nmg 时间: 2008-12-2 19:17 标题: 万分感谢!
谢谢了。我试了。和我想的一样。就是这个意思。
只是有在运行一次后。 如果存在和文件名相同的文件夹的话就出来很多的文件夹。和5楼的效果是一样的了。哈哈。 不过我用时注意一下就好。谢谢了。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |