Board logo

标题: [文件操作] 批处理复制文件时如何备份同名文件? [打印本页]

作者: alpha    时间: 2010-3-16 23:33     标题: 批处理复制文件时如何备份同名文件?

有没有这样一种工具:

如果文件在复制过程中,如果遇到文件名相同的文件,则先将原文件移动(或者拷贝)至本目录下的“backup”文件夹中(要被覆盖的文件是许多无规则文件),然后再进行覆盖。

谢谢各位帮忙找找,无论是DOS命令还是什么代码均可,现在急需。
作者: sgaizxt001    时间: 2010-3-17 07:03

一搜就有了
if exist a (copy a backup\a) else (move a x\a)
请注意我的代码
作者: BatCoder    时间: 2010-3-17 10:11

是的,请注意2楼的代码,千万别犯他这样的错误。
作者: alpha    时间: 2010-3-17 20:14

我把2楼的代码修改了一下:
  1. if exist a (copy a\*.* x\*.*) else (copy a\*.* backup\*.*)
复制代码
拷贝没问题,但是,如果有相同文件时,并没有对原文件备份至backup目录里,怎么回事?

还有个问题,如果目录中包含子目录含有空格文件名的文件怎么办?

[ 本帖最后由 alpha 于 2010-3-17 20:15 编辑 ]
作者: BatCoder    时间: 2010-3-17 20:32     标题: 回复 4楼 的帖子

你的代码逻辑是不是错了,存在同名文件时应该copy到backup,你怎么写反了?
文件名有双引号的问题,请使用双引号。
作者: yangfengoo    时间: 2010-3-17 20:49

  1. @echo off
  2. for /f "tokens=*" %%a in ('dir /s/b/a-d "..\a\"') do (
  3. if exist "%cd%\x\%%~nxa" (move /y "%cd%\x\%%~nxa" "%cd%\backup\%%~nxa")
  4. copy "%%~a" "%cd%\x\%%~nxa"
  5. )
复制代码

作者: alpha    时间: 2010-3-17 21:37

运行6楼的代码时,提示:“系统找不到指定的文件。”怎么回事?另外,6楼能不能把代码解释一下,多谢
作者: BatCoder    时间: 2010-3-17 21:56     标题: 回复 7楼 的帖子

你吧@echo off删掉,看看是哪个文件出错了。
作者: alpha    时间: 2010-3-17 23:14

原帖由 BatCoder 于 2010-3-17 21:56 发表
你吧@echo off删掉,看看是哪个文件出错了。

去掉后,提示如下:
  1. C:\Users\administrator\Desktop>for /F "tokens=*" %a in ('dir /s/b/a-d "..\a\"') do (
  2. if exist "C:\Users\administrator\Desktop\x\%~nxa" (move /y "C:\Users\administrator\Desktop\x\%
  3. ~nxa" "C:\Users\administrator\Desktop\backup\%~nxa" )
  4. copy "%~a" "C:\Users\administrator\Desktop\x\%~nxa"
  5. )
  6. 系统找不到指定的文件。
复制代码

作者: sgaizxt001    时间: 2010-3-18 00:14

我给的代码只是提供一个思路而已,根本不算是代码,用if exist判断文件存在不存在。
我认为如果自己要移动的或者备份的东西都是固定路劲的话,在写代码的时候直接给定,用%~nx虽然显得比较高深,但是不大实用
作者: BatCoder    时间: 2010-3-18 02:41     标题: 回复 10楼 的帖子

你的思路过于简单,以楼主目前的水平,还没有办法根据这个思路搞定“包含子目录”的情况。而且从4楼的代码来看,楼主明显没有理解你的思路,代码越改,离你的思路越远。

%~nx是批处理最基本的用法了,怎么会高深呢?你确定自己的思路能够完全满足楼主的需求?
作者: yangfengoo    时间: 2010-3-18 08:17

  1. @echo off
  2. for /f "tokens=*" %%a in ('dir /s/b/a-d a\') do (
  3. if exist "x\%%~nxa" (move /y "x\%%~nxa" "backup\%%~nxa")
  4. copy "%%~a" "x\%%~nxa"
  5. )
  6. pause
复制代码
已修正
作者: alpha    时间: 2010-3-18 18:33

按照12楼的代码运行后,比较成功,但就是还有一个问题没有解决:

假如a文件夹中包含“123”、“456”等子目录,那我将如何实现将a文件夹中的所有文件以及“123”、“456”等子目录全拷贝至x目录,也就是说,拷贝后,x文件夹中也要有“123”、“456”等这些文件夹极其文件。简而言之,就好比我们用电脑中“复制”这个操作一样,连同文件及所有子目录一同进行复制。

当然了,要求还是不变,若目标文件夹x中已经存在“123”、“456”等子目录,就要如同上文的设置,要将文件及所有子目录文件夹/文件,一同备份至backup目录里。

有劳你了。多谢。
作者: alpha    时间: 2010-3-21 11:34

自己顶起来~~~help me
作者: alpha    时间: 2010-3-23 16:30

大家帮忙解决下~!尤其是yangfengoo同志,有劳了
作者: x9tiancmd    时间: 2010-3-23 18:23

原帖由 alpha 于 2010-3-17 21:37 发表
运行6楼的代码时,提示:“系统找不到指定的文件。”怎么回事?另外,6楼能不能把代码解释一下,多谢
回复 7楼 的帖子你吧@echo off删掉,看看是哪个文件出错了。



   要把copy  "" ""
红色的的引号对去掉,   我曾经为了这个问题,    把一大串批处理代码, 反反复复找了N遍,    现在记死了也不会犯这个错误那就是: "for 过的变量,无论它有多长永远别带引号对..COPY即前一对引号必须省略"

[ 本帖最后由 x9tiancmd 于 2010-3-23 18:26 编辑 ]
作者: alpha    时间: 2010-3-23 20:24

能不能在12楼的代码上进行修改?

需改进的:假如a文件夹中包含“123”、“456”等子目录,那我将如何实现将a文件夹中的所有文件以及“123”、“456”等子目录全拷贝至x目录,也就是说,拷贝后,x文件夹中也要有“123”、“456”等这些文件夹极其文件。简而言之,就好比我们用电脑中“复制”这个操作一样,连同文件及所有子目录一同进行复制。

当然了,要求还是不变,若目标文件夹x中已经存在“123”、“456”等子目录,就要如同上文的设置,要将文件及所有子目录文件夹/文件,一同备份至backup目录里。
作者: alpha    时间: 2010-3-28 22:58

自己顶起来!~~~!
作者: terse    时间: 2010-3-29 10:52

没有进一步判断子目录 仅一级目录判断
  1. @echo off
  2. MD "backup\" 2>nul
  3. set "FilesA=e:\a"
  4. set "FilesB=f:\x"
  5. for /f "tokens=*" %%i in ('dir /b "%FilesA%"') do (
  6. if exist "%Filesa%\%%i\"  (
  7.    if exist "%Filesb%\%%i\" XCOPY /Y /H /R /E "%Filesa%\%%i" "backup\%%i\" >nul 2>nul
  8.    XCOPY /Y /H /R /E "%Filesa%\%%i" "%Filesb%\%%i\" >nul 2>nul
  9.   ) else (
  10.     if exist "%Filesb%\%%i" copy "%Filesa%\%%i" "backup" >nul 2>nul
  11.     copy "%Filesa%\%%i" "%Filesb%" >nul 2>nul
  12.   )
  13. )
  14. pause
复制代码

作者: caruko    时间: 2010-3-29 12:47

利用了xcopy /U /L 特性
假设文件夹为d:\test\a,d:\test\c
  1. @echo off
  2. mkdir d:\test\c\backup
  3. for /f "tokens=*" %%i in ('xcopy /e /u /y d:\test\a d:\test\c ^|findstr /v "复制了"') do (
  4.         mkdir %%~dpi 2>nul
  5.         call :backup %%~pnxi
  6. )
  7. xcopy /e /f  /y d:\test\a d:\test\c >>resuit.txt
  8. goto :eof
  9. :backup
  10. set dir=%*
  11. set dir=%dir:\test\a\=%
  12. copy /y  "d:\test\c\%dir%" "d:\test\c\backup\%dir%"
  13. goto:eof
复制代码

[ 本帖最后由 caruko 于 2010-3-30 16:44 编辑 ]




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