Board logo

标题: [文件操作] 批处理如何在xcopy后输出所复制的目标文件路径? [打印本页]

作者: alpha    时间: 2010-5-30 22:07     标题: 批处理如何在xcopy后输出所复制的目标文件路径?

我准备使用xcopy完成一次批量的复制工作,现在使用的代码是:
  1. xcopy /e/y "%cd%\Path" "%cd%"
复制代码

上述代码是要将“%cd%\Path”目录中所有文件(包括子目录及空格文件)一同复制到“%cd%”目录下面。

现在我想实现一个新功能。当我复制这些文件的时候,输出一个名为test.txt的文件,text文本文件中每行格式如下:
  1. del /f /s /q ..\..\..\********
复制代码

其中********表示在xcopy过程中目标文件的路径(相对路径)!

举个例子:

  1. xcopy /e/y "Temp\Bari\A.exe" "Bari\A.exe"
复制代码


上述语句中,输出的text文件应该输出如下一行:

  1. del /f /s /q ..\..\..\Bari\A.exe
复制代码

作者: hanyeguxing    时间: 2010-5-30 23:51

/f 复制时显示源文件名和目标文件名。

批处理中,利用xcopy的/f参数获取目标文件:
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /F "tokens=2 delims=>" %%a in ('xcopy /csef "Temp\Bari\A.exe" "Bari\A.exe"') do set "a=%%a"&echo.del /f /s /q "!a:~1!")>test.txt
复制代码

[ 本帖最后由 hanyeguxing 于 2010-5-31 00:13 编辑 ]
作者: alpha    时间: 2010-5-31 19:36

按照2楼的操作后,提示:不能进行循环复制
作者: hanyeguxing    时间: 2010-5-31 20:00

周期性复制错误是xcopy在初始化时检测到的一种语法错误,和使用不使用/f没有关系,也和for /f解析标准输出没有关系,即去掉for /f和xcopy的/f参数,周期性复制(循环复制)依然是存在的。
周期性复制(循环复制):xcopy在执行前,会对xcopy命令段语法进行检测,满足以下条件即为周期性复制:
1,使用子目录操作参数/s、/t、/e。
2,目标目录为源目录的某一级子目录。
同时存在以上两个条件时,即为周期性复制(循环复制),有以下特征:
1,返回错误代码为4
2,该错误信息不会被/c参数所屏蔽。
3,即使使用/l参数不执行实际的复制操作,周期性复制也是不允许的。
4,无论源和目标是文件还是目录,周期性复制都是不允许的。

ps:在xcopy的实际使用过程中,不适写成xcopy /csef "Temp\Bari\A.exe" "Bari\A.exe",因为这样容易造成xcopy请求确认并等待应答的。所以推荐写成xcopy /csef "Temp\Bari\A.exe" "Bari\"

[ 本帖最后由 hanyeguxing 于 2010-5-31 20:13 编辑 ]
作者: alpha    时间: 2010-5-31 20:29

按照4楼的方法,问题基本解决了,但是如何实现是相对路径呢?

[ 本帖最后由 alpha 于 2010-5-31 20:35 编辑 ]
作者: hanyeguxing    时间: 2010-5-31 20:40     标题: 回复 5楼 的帖子

  1. @echo off&setlocal enabledelayedexpansion
  2. (for /F "tokens=2 delims=>" %%a in ('xcopy /csefi "Temp\Bari\A.exe" "Bari"') do set a=%%a&set a=!a:%cd%\=!&echo.del /f /s /q ..\..\!a:~1!)>test.txt
复制代码
使用set替换删除,然后echo.根据自己的需要写。

[ 本帖最后由 hanyeguxing 于 2010-5-31 20:43 编辑 ]
作者: alpha    时间: 2010-5-31 20:49

好的,问题已经解决,现在再问个附加的问题,6楼给的是5行代码,能否合并为一行?
作者: hanyeguxing    时间: 2010-5-31 20:55

批处理中:
  1. @echo off&setlocal enabledelayedexpansion&(for /F "tokens=2 delims=>" %%a in ('xcopy /csefi "Temp\Bari\A.exe" "Bari"') do set a=%%a&set a=!a:%cd%\=!&echo.del /f /s /q ..\..\!a:~1!)>test.txt
复制代码
cmd下或“运行”中:
  1. cmd /q /v:on /k "(for /F "tokens=2 delims=>" %%a in ('xcopy /csefi "D:\Temp\Bari\A.exe" "D:\Bari"') do set a=%%a&set a=!a:D:\=!&echo.del /f /s /q ..\..\!a:~1!)>D:\test.txt"
复制代码

作者: xinje    时间: 2010-5-31 20:56

楼主的要求很苛刻啊。不过你说的要合为一行,用&也许可以合并,但不保证能用。你试试吧。
为啥要合并一行呢?
作者: alpha    时间: 2010-5-31 21:01

原帖由 xinje 于 2010-5-31 20:56 发表
楼主的要求很苛刻啊。不过你说的要合为一行,用&也许可以合并,但不保证能用。你试试吧。
为啥要合并一行呢?

我有一个软件,要想嵌入bat,必须合并为一行,实际上我也希望不麻烦大家
作者: xinje    时间: 2010-5-31 21:41     标题: 回复 10楼 的帖子

呵呵。把BAT编译成EXE吧。
转换成一行可以运行一些简单的命令。复杂的就不好说了。
我写的一个编译器,就存在这样的问题。

用&来连接命令。祝你好运。

还有,如果想写EXE文件,不如去学习一下编程,你所说的这些还是非常简单的,反而用批处理会复杂。
BAT2exe还是有太多局限性。加油兄弟。
作者: Batcher    时间: 2010-5-31 22:40     标题: 回复 10楼 的帖子

那你为啥不在最开始发帖提问的时候就说清楚这个要求呢?




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