在Windows批处理中复制目录+路径到新位置(使用robocopy)

时间:2015-11-02 22:48:49

标签: batch-file robocopy

我正试图在我给出的脚本中标准化部分复制。

因此,重新编写以下块会很好:

REM Copy files
for %%x in (%var1%) do (
    copy %src%\%%x %dest%\%%x
)

其中var1包含folder\folder\file.fileExtension格式的字符串,因此示例如下:

var1=test\test1\test1.txt test\test1\test2.txt test\test3\randomfile.cmd

目的地尚不存在(目前它只是单独创建)。

不幸的是robocopy不会以这种方式复制(它不会接受格式folder\filefolder\file作为源头和目的地,而是我所见过的。这意味着我需要将最后一个反斜杠的变量分解为两个变量,或者使用不同的复制工具(如copyxcopy),但这是“不鼓励”。

有没有人有一种聪明的方法让robocopy接受这种格式而不创建一个新函数来将传递的变量分解为两个新变量?或者是否有不同的方法来存储可以删除此问题的folder\file路径的可迭代列表?

我已经能够从给定%%~n的传递参数中检索名称部分,但是无法检索传递参数的路径部分,因为它不是完整路径。我尝试使用for循环来删除该部分(类似于此处的结果:Last token in batch variable

这不起作用,因为它是一个\分隔的字符串,据我所知,你不能在for /f中以FOREACH样式循环。

3 个答案:

答案 0 :(得分:1)

这是我使用的完整解决方案,这与aschipfl发布的内容非常相似(我还从其实际脚本中修改了其他内容以使其更有意义 - robocopy包装器是一个处理robocopy错误的包装脚本例如,更改变量名称):

...

REM Copy SWFs
set src=%SV1%\%V2%\%V3%
set dest=.\%DV1%\%V2%\%V3%
call :doPatchSWFFileCopy

set src=%SV1%\%V2%\%V3%
set dest=.\%DV1%\%DV2%\%V3%
call :doPatchSWFFileCopy

...

:doPatchSWFFileCopy
SETLOCAL EnableDelayedExpansion
for %%I in (%_filelist_%) do (
    REM Append file path to source and dest, as well as a pipe to prevent same name copies
    set "src=%src%\%%~I|"
    set "dest=%dest%\%%~I|"
    REM Truncate only LAST item (file name + extension) and the pipe character from the paths:
    set "src=!src:%%~nxI|=!"
    set "dest=!dest:%%~nxI|=!"
    REM truncate trailing slash
    call %robocopywrapper% "!src:~,-1!" "!dest:~,-1!" "%%~nxI"
)
ENDLOCAL
goto :EOF

答案 1 :(得分:0)

考虑到您提到的for阻止,您可以通过以下方式将copy替换为robocopy命令:

for %%v in (%listOfFiles%) do (robocopy %%~dv%%~pv %destinationPath% %%~nv%%~xv)

正如评论中已经提到的那样,%%~dv%%~pv%%~nv%%~xv是分别扩展磁盘的路径,路径(不包括磁盘),名称和%%v变量的扩展名。当然,只有指向文件路径的变量才能实现这种扩展。最后,robocopy命令的语法至少需要源路径,目标路径和要复制的文件列表。然后,如果先前定义了目标路径,则脚本应该可以正常工作。

编辑n.r 1
如果在%listOfFiles%文件中没有列出完整路径但只列出其中的一部分,则可以使用*字符尝试以正确的方式填充它。此功能的一个简单示例可以是:

C:\Users\username>cd D*p
C:\Users\username\Desktop>_

答案 2 :(得分:0)

以下代码可能对您有用(请参阅rem备注以获得简要说明):

rem define source and destination roots here (no trailing `\` allowed!):
set "src=D:\path\to\source\dir"
set "dst=D:\path\to\destin\dir"
rem define list of items here:
set var1="test\test1\test1.txt" "test\test1\test2.txt" "test\test3\randomfile.cmd"

setlocal EnableDelayedExpansion
for %%I in (%var1%) do (
    rem append variable item to source and destination roots,
    rem and append a `|` which is not allowed in file names:
    set "src=%src%\%%~I|"
    set "dst=%dst%\%%~I|"
    rem truncate only LAST item (name+ext.) and `|` from the paths:
    set "src=!src:%%~nxI|=!"
    set "dst=!dst:%%~nxI|=!"
    rem supply paths with trailing `\` removed and LAST item (name+ext.) to `robocopy`:
    robocopy "!src:~,-1!" "!dst:~,-1!" "%%~nxI"
)
endlocal

您可能会注意到,临时附加了管道符号|,这是文件路径的禁止字符。即使所有受影响的树中的一个或多个目录与任何复制的文件(test1.txttest2.txt或{{1}具有相同的名称,该方法也不会失败。在示例中)。