【问题标题】:Batch File XCopy Command批处理文件 XCopy 命令
【发布时间】:2010-12-23 22:26:42
【问题描述】:

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

这是sn-p。

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 命令不起作用,或者我在这里遗漏了一些东西来抑制上面的消息。

【问题讨论】:

    标签: command-line copy xcopy


    【解决方案1】:

    好吧,您忽略了帮助提供的关于/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 个字符时,它会失败。

    【讨论】:

    • hack 的好点子,我会尝试你的解决方案......你可以看到那里有一个时间戳检查 /d 所以 /d 意味着只有在目的地较旧时才复制。因此,如果 commandA 的源版本比目标版本新,那么它将替换它,反之亦然,对于 commandB。
    • 啊,懒得详细剖析那里的开关了,抱歉 :-)
    【解决方案2】:

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

    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
    

    【讨论】:

    • 是的,这会起作用,但正如您所见,我使用文本文件并将其存储到 %%a 是有原因的,这样我就有了一个动态的目标路径。图片不是那里唯一的预期路径。
    • 好点。我更新了我的答案以表明您可以从文本文件中的项目中提取路径。
    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    相关资源
    最近更新 更多