我有一个批处理文件,它循环遍历文本文件的内容,并使用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命令没有用,或者我在这里遗漏了一些东西来压制上面的消息。
答案 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