我正试图在我给出的脚本中标准化部分复制。
因此,重新编写以下块会很好:
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\file
和folder\file
作为源头和目的地,而是我所见过的。这意味着我需要将最后一个反斜杠的变量分解为两个变量,或者使用不同的复制工具(如copy
或xcopy
),但这是“不鼓励”。
有没有人有一种聪明的方法让robocopy
接受这种格式而不创建一个新函数来将传递的变量分解为两个新变量?或者是否有不同的方法来存储可以删除此问题的folder\file
路径的可迭代列表?
我已经能够从给定%%~n
的传递参数中检索名称部分,但是无法检索传递参数的路径部分,因为它不是完整路径。我尝试使用for
循环来删除该部分(类似于此处的结果:Last token in batch variable)
这不起作用,因为它是一个\
分隔的字符串,据我所知,你不能在for /f
中以FOREACH样式循环。
答案 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.txt
,test2.txt
或{{1}具有相同的名称,该方法也不会失败。在示例中)。