Board logo

标题: 【已解决】只复制文件夹 不包括里面的内容 [打印本页]

作者: ganjie     时间: 2009-4-5 04:00    标题: 【已解决】只复制文件夹 不包括里面的内容

小弟想复制某文件夹下的所有文件夹和子文件夹,但不复制文件夹内的文件(除了jpg与gif图片格式),这要怎么写?谢谢!
如果某文件夹内没有 jpg 或 gif 文件呢?那么还要复制该文件夹吗?要的。



不要只给我一段中文的解释说明,也不要只给我一小段代码,然后让我自己去想办法,如果是这样,谢绝回复。其实刚刚在其它论坛发贴过!

[ Last edited by ganjie on 2009-4-6 at 01:21 ]
作者: ZJHJ     时间: 2009-4-5 08:58
先复制再删除
作者: czl1378     时间: 2009-4-5 11:03
有道理。我怎么没想到呢。。先复制所有的文件跟文件夹。然后再删除不是JPG或GIF的文件。

楼主说:“不要只给我一段中文的解释说明,也不要只给我一小段代码,然后让我自己去想办法,如果是这样,谢绝回复”。。。我在想要不要给你回呢。但是有中文解释总比没有好,对不。
作者: Cappuccin0     时间: 2009-4-5 11:56
robocopy Log log2 /mir /zb /xf *.*

用robocopy拷贝在忽略掉所有文件就是了
作者: yishanju     时间: 2009-4-5 11:59
C:\Documents and Settings\Administrator>xcopy /?
复制文件和目录树。

XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W]
                           [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U]
                           [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z]
                           [/EXCLUDE:file1[+file2][+file3]...]

  source       指定要复制的文件。
  destination  指定新文件的位置和/或名称。
  /A           只复制有存档属性集的文件,
               但不改变属性。
  /M           只复制有存档属性集的文件,
               并关闭存档属性。
  /D:m-d-y     复制在指定日期或指定日期以后更改的文件。
               如果没有提供日期,只复制那些源时间
               比目标时间新的文件。
  /EXCLUDE:file1[+file2][+file3]...
               指定含有字符串的文件列表。每一个字符串
               必须在文件的单独行中。如果有任何
               字符串与要被复制的文件的绝对路径
               相符,那个文件将不会得到复制。
               例如,指定如 \obj\ 或 .obj 的字符串会排除
               目录 obj 下面的所有文件或带有
               .obj 扩展名的文件。
  /P           创建每个目标文件前提示。
  /S           复制目录和子目录,除了空的。
  /E           复制目录和子目录,包括空的。
               与 /S /E 相同。可以用来修改 /T。
  /V           验证每个新文件。
  /W           提示您在复制前按键。
  /C           即使有错误,也继续复制。
  /I           如果目标不存在,又在复制一个以上的文件,
               则假定目标一定是一个目录。
  /Q           复制时不显示文件名。
  /F           复制时显示完整的源和目标文件名。
  /L           显示要复制的文件。
  /G           允许将没有经过加密的文件复制到
               不支持加密的目标。
  /H           也复制隐藏和系统文件。
  /R           覆盖只读文件。
  /T           创建目录结构,但不复制文件。
               不包括空目录或子目录。/T /E 包括
               空目录和子目录。
  /U           只复制已经存在于目标中的文件。
  /K           复制属性。一般的 Xcopy 会重置只读属性。
  /N           用生成的短名复制。
  /O           复制文件所有权和 ACL 信息。
  /X           复制文件审核设置(隐含 /O)。
  /Y           复制文件审核设置(隐含 /O)。
               现存目标文件。
  /-Y          导致提示以确认改写一个
               现存目标文件。
  /Z            用重新启动模式复制网络文件。

命令行开关 /Y 可以预先在 COPYCMD 环境变量中设置。
这可能被命令行上的 /-Y 改写。
作者: yishanju     时间: 2009-4-5 11:59
尝试XCOPY /T 创建目录结构
作者: czl1378     时间: 2009-4-5 14:49
人家都说了:不要中文解释,也不要他自己想办法。yishanju兄你就发段完整代码贝
作者: ganjie     时间: 2009-4-5 23:04
不是不想办法,而是已经在想办法了,因为源文件很大的说,有上百G的文件,光是要复制过来的图片文件就有可能超G的,复制全部再删,这回贴,显然没有想想发贴人的心情,纯是不负责任的回复,但大家的热心回贴,偶也是感激的,谢谢了,偶已经自己编了三个批处理,然后用call来调用达到目的了,再次谢谢!

[ Last edited by ganjie on 2009-4-5 at 23:34 ]
作者: ganjie     时间: 2009-4-6 08:45
本贴的完整代码如下,已经经过测试!
@echo off
::目的文件夹名为 temp
set wjj=temp
::复制文件夹及子文件夹
for /f "delims=" %%a in ('dir/b/s/ad') do (
if not exist "%wjj%\" md "%wjj%"
set "var=%%a"
setlocal enabledelayedexpansion
set var=!var:*%cd%=!
md "%wjj%!var!"
endlocal
)
::复制 jpg 和 gif 文件
for /f "delims=" %%a in ('dir/b/s/a-d *.jpg *.gif') do (
set "var=%%a"
setlocal enabledelayedexpansion
set var=!var:*%cd%=!
copy /y "%%a" "%wjj%!var!"
endlocal
)
pause
感谢批处理论坛的随风。
作者: dosz     时间: 2009-4-6 09:33
1,创建相同之文件夹。
2,复制图片之文件。
有理。
作者: balinger     时间: 2009-4-6 09:43
哎,可惜楼主的系统里没有XCOPY!
作者: dosz     时间: 2009-4-6 10:22


  Quote:
Originally posted by balinger at 2009-4-6 09:43:
哎,可惜楼主的系统里没有XCOPY!

要是这样的话,那是『第 2 楼』的”先复制再删除“
作者: netbenton     时间: 2009-4-6 11:47
9楼的代码,md之后可以马上就copy  *.jpg ... &copy *.gif ... 省去后面的那个for
应该效率会高一些
作者: HAT     时间: 2009-4-6 13:03


  Quote:
不是不想办法,而是已经在想办法了,因为源文件很大的说,有上百G的文件,光是要复制过来的图片文件就有可能超G的,复制全部再删,这回贴,显然没有想想发贴人的心情,纯是不负责任的回复

你为啥不在顶楼说明源文件很大?这不是浪费别人的时间嘛?你总觉得别人回复不负责任,为啥不想想自己的提问方式是否负责人?你考虑过帮你解决问题的人的心情么?
作者: HAT     时间: 2009-4-6 13:04


  Quote:
Originally posted by balinger at 2009-4-6 09:43 AM:
哎,可惜楼主的系统里没有XCOPY!

你从什么总结出楼主的系统没有XCOPY?
作者: balinger     时间: 2009-4-7 02:30
回HAT版主。
XCOPY本就是带目录结构复制文件的。如楼主的系统有XCOPY,以编9楼代码的水平,应当直接用XCOPY。
其实,一是对楼主的提问方式不满,尤其“其实刚刚在其它论坛发贴过!”一句,好象有本坛非得跟其他论坛PK之嫌。二是想提示楼主,5楼yishanju已指出的XCOPY,本是最佳。
以我对本坛的认知,相信许多人都清楚,9楼代码虽有水准,但就楼主的问题而言,简单问题复杂化了。
作者: 26933062     时间: 2009-4-7 05:01
就9楼代码而言,我认为13楼给的建议非常好,但用xcopy直接实现我确实不知怎么办。楼主的要求是保留批处理当前目录的所有目录及子目录以及jpg、gif文件。
如何用xcopy只复制指定后缀的文件还请兄不吝赐教。
曾经尝试过用xcopy /t /e 来构建目录树,但发现如果目标目录也在批处理当前目录时会提示“不能执行周期性复制”的错误。
zpz0012005 兄曾给过一个 xcopy 的代码,但如果“目标目录”在“某文件夹具体路径”里时会提示“不能执行周期性复制”
@echo off
set src=某文件夹具体路径
set dst=目标目录
for %%a in (jpg gif) do xcopy /s/e/c "%src%\*.%%a" "%dst%\"
[ Last edited by 26933062 on 2009-4-7 at 05:32 ]
作者: balinger     时间: 2009-4-7 11:33
@echo off
set src=源目录路径
set dst=目标目录
for %%a in (jpg gif) do xcopy /s/e/c "%src%\*.%%a" "%dst%\"

我的理解是,该批处理不在源目录下,生成的目标目录与批处理在同一目录。否则不必指定源目录具体路径,直接用.代替%src%即可。

如果该批处理在源目录下,会提示“不能执行周期性复制”的错误。因为被复制的源目录包含了目标目录。其实可以变通一下,把目标目录移到父目录下,与源目录并列:
@echo off
set dst=目标目录名
for %%a in (jpg gif) do xcopy /s/e/c ".\*.%%a" "..\%dst%\"

同理,如果批处理不在源目录下,希望生成的目标目录与源目录在一起:
@echo off
set src=源目录路径
set dst=目标目录
for %%a in (jpg gif) do xcopy /s/e/c "%src%\*.%%a" "%src%\..\%dst%\"

当然,如果源目录是根目录,用..肯定不行。其实9楼的代码现在也不适合在根目录下执行,不过他可以修改,加一个\。

一定要生成的目标目录在源目录下,9楼的代码可以,xcopy不可以。但我以为并不必要,复制本身就是从一个地方到另一个地方,不改变被复制的对象。xcopy不允许目标目录在源目录中,不是没有道理的。

楼主没有要求目标目录在源目录下,也没要求批处理在源目录下,复制的对象也不是根目录。依我的愚见,就两个xcopy就得了,文件类型多了再用for。

xcopy /s/e/c "c:\123\*.jpg" "d:\456\"
xcopy /s/e/c "c:\123\*.gif" "d:\456\"
作者: ligui0001     时间: 2009-4-9 04:13
5楼写不不错
作者: a22124497     时间: 2009-4-10 00:10
DIR得到文件事夹,然后再创建文件不就行了嘛?