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

[文件操作] 调用时间参数移动文件

我想写个批处理。。。
将以时间为名的文件夹(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 编辑 ]

  1. @echo off
  2. ::这样同名文件移动到同一目录下不就重名了
  3. setlocal enableDelayedExpansion
  4. for /f "delims=" %%i in ('dir/s/b/a-d^|findstr "2008"') do (
  5.  :addnum
  6.  set/a "%%~ni+=1"
  7.  if not exist "%%~ni\%%~ni!%%~ni!%%~xi" (
  8.   move "%%i" "%%~ni\%%~ni!%%~ni!%%~xi"
  9.  ) else (goto :addnum)
  10. )
  11. pause>nul
复制代码

TOP

谢谢

谢谢您的回复,不过我太笨,,没有看明白。。能不能多给我解释一下??
你写的代码在批处理中就可以直接用么??

TOP

你可以先创建一个用于测试的目录,如:测试目录
下面有四个目录: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 就可以看到效果了。

TOP

这里要指出2楼代码中的一个不“健康”的地方,在for内部使用标签会在某种情况下出现错误(具体的也说不上

)反正设计合理的代码是不需要在for内部使用标签的。
看楼主的意识是要把当前目录下,所有以纯数字命名的文件夹中的bmp文件按文件名新建文件夹,并把文件移动

到相应的文件夹内,
2楼的代码还有一个不足之处,findstr "2008" 应该是findstr /b "2008"
否则的话  abcd2008efg  这样的文件夹也会被匹配。
并且 dir/s/b/a-d 指定的是文件而不是文件夹,所以该代码应该会不能正确运行。
以下代码未测试。。。
  1. @echo off
  2. for /f "delims=" %%i in ('dir/b/ad^|findstr "^[0-9]*[0-9]$"') do (
  3.   for /f "delims=" %%a in ('dir/b "%%i\*.bmp"') do (
  4.       if not exist "%%i\%%~na\" md "%%i\%%~na"
  5.       move "%%i\%%~nxa" "%%i\%%~na"
  6. ))
  7. pause>nul
复制代码

[ 本帖最后由 随风 于 2008-11-26 21:07 编辑 ]
技术问题请到论坛发帖求助!

TOP

回复 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 编辑 ]

TOP

代码可以用。

谢谢 冰疼 老兄了。你的代码我测试的是可以用的。

不过不好意思我忘记说了。


我的文件夹里面文件名不是a,b ,,而是汉字 ,,a,b 的意思是每个文件夹里的文件名字都一样。但不是简单的字母,是汉字词语,而转出的文件夹也最好是汉字,您看怎么修改一下您的代码。我用你说的方法试了,和我想的意思是一样的。

还有最好是用复制的,因为每个文件确切说是图片都是差不多的,所以如果移动错了就很难在转回来了。

谢谢你。

TOP

不好意思

不好意思。忘记说了。还有一个。


每个文件夹里面不只两个文件。有很多。大概要6个或以上。但是所有文件夹里的文件数都是相同的。

TOP

回复 8楼 的帖子

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

TOP

我在 2 楼的代码可以处理汉字,但处理有空格的文件会出错。

以下代码标签外置,自动判断是否存在图片同名目录,添加处理空格能力。
还是使用 move,毕竟这样比较快,
非要用 copy 不可的话把 [ move "%~1" "%~n1\%~n1!n!%~x1" ] 这句换成
[ copy  "%~1" "%~n1\%~n1!n!%~x1">nul ]
  1. ::使用方法是放在以日期为名的目录的同一目录下双击运行。
  2. @echo off
  3. setlocal enableDelayedExpansion
  4. for /f "delims=" %%i in ('dir/s/b/a-d *.jpg *.bmp^|findstr "\\2008"') do (
  5.  call :Mov "%%i"
  6. )
  7. echo 移动完成。按任意键退出……
  8. pause>nul
  9. goto :eof
  10. :Mov
  11. set n=
  12. if not exist "%~n1" md "%~n1"
  13. :addnum
  14. if not exist "%~n1\%~n1!n!%~x1" (
  15.  move "%~1" "%~n1\%~n1!n!%~x1"
  16. ) else (
  17.  set/a n+=1
  18.  goto :addnum
  19. )
复制代码

TOP

  看了顶楼的描述,有点云里雾里的感觉,有如下疑问:
  1、你这个批处理是每天都要运行一次的吗?
  2、如果每天都要运行一次,则每次只需要移动最新文件夹中的文件就可以了吧?
  3、如果不是每天都要运行一次,那么,把所有文件夹下的文件复制到统一的文件夹下之后,同名的文件岂不是要被全部覆盖、最后只剩下最后一天的文件?这样一来,扫描每一个以日期命名的文件夹又有什么意义?
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

万分感谢!

谢谢了。我试了。和我想的一样。就是这个意思。

只是有在运行一次后。 如果存在和文件名相同的文件夹的话就出来很多的文件夹。和5楼的效果是一样的了。哈哈。 不过我用时注意一下就好。谢谢了。

TOP

返回列表