批处理文件XCopy命令

时间:2009-12-07 08:20:29

标签: command-line copy xcopy

我有一个批处理文件,它循环遍历文本文件的内容,并使用xcopy命令复制特定文件。

这是片段。

for /f %%a in (FilesToCopy.txt) do (
xcopy ..\..\Common\%%a Common\%%a /i /d /c /v /s /y /f 
xcopy Common\%%a ..\..\Common\%%a /i /d /C /v /s /y /f 
)

%% a包含类似的值 图片\ image1.jpg 图像\ image2.jpg

所以当执行xcopy时,它看起来像

xcopy ..\..\Common\Images\image1.jpg Common\Images\image1.jpg /i /d /c /v /s /y

执行后,它会提示此消息

Does Common\Images\image1.png specify a file name
or directory name on the target
(F = file, D = directory)?

似乎/ i命令没有用,或者我在这里遗漏了一些东西来压制上面的消息。

2 个答案:

答案 0 :(得分:5)

好吧,你遗漏了关于/I的帮助提供的第二个语句:

/I           If destination does not exist and copying more than one file,
             assumes that destination must be a directory.

您一次只复制一个文件,因此/I不适用。

你可以通过将F传递给命令并抑制输出来解决这个问题:

echo F|xcopy ..\..\Common\%%a Common\%%a /i /d /c /v /s /y /f >nul

(不适用于非英语版本的Windows;但考虑到批处理已经因文件名带空格而失败,可能这是您遇到的问题中最少的一部分: - )

您可以尝试构建一个长文件名列表进行复制:

setlocal enabledelayedexpansion enableextensions
set LIST=
for /f %%a in (FilesToCopy.txt) do set LIST=!LIST! "..\..\Common\%%a"
xcopy %LIST% Common /i /d /c /v /s /y /f

但是,这需要在初始文件上进行两次传递。当文件名列表超过8190个字符时,它会失败。

答案 1 :(得分:1)

目的地应该是路径,然后它不会问:

xcopy ..\..\Common\Images\image1.jpg Common\Images\ /i /d /c /v /s /y

在您的情况下,您可以在目标上使用%~p的路径提取,因为您可能希望保留该路径:

xcopy ..\..\Common\%%a Common\%%~pa /i /d /c /v /s /y
相关问题