1

我有一个批处理文件,它遍历文本文件的内容并使用 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 包含像 Images\image1.jpg Images\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 命令不起作用,或者我在这里遗漏了一些东西来抑制上面的消息。

4

2 回答 2

5

好吧,您遗漏了帮助提供的第二条语句/I

/I 如果目标不存在并且复制多个文件,
             假定目的地必须是一个目录。

您一次只能复制一个文件,因此/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 个字符时,它会失败。

于 2009-12-07T08:31:14.253 回答
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
于 2009-12-07T08:40:36.247 回答