![在 Windows 中使用完整相对路径复制文件](https://linux22.com/image/1592206/%E5%9C%A8%20Windows%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%AE%8C%E6%95%B4%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84%E5%A4%8D%E5%88%B6%E6%96%87%E4%BB%B6.png)
我有一大堆文件(超过 45,000 个),并且文件夹结构相当复杂。我提取了大约 13,000 个文件及其路径(相对于根文件夹)的子集,并希望将其与原始文件夹路径一起复制。
尽管我已经彻底搜索过了,但我还是找不到使用 xcopy 或 robocopy 来做我想做的事情的方法。我可以轻松地为列表中的每个条目创建一个带有一个复制命令的批处理文件。但是,我找不到任何 x/robocopy 开关或开关组合来从我的源文件生成目标中的文件夹路径,例如:
xcopy dir1\dir2\dir3\file.txt copy_folder /<some switches>
或者
xcopy dir1\dir2\dir3\file.txt copy_folder\dir1\dir2\dir3\file.txt /<some switches>
dir1\dir2\dir3
如果文件夹下不存在路径,我希望它创建路径copy_folder
并将其副本放在file.txt
那里。据我所知,Linux 上cp --parent
确实如此。
非常欢迎任何关于实现这一目标的最佳方法的建议!
答案1
如果文件夹不存在,XCOPY 将创建文件夹,但它首先会询问目标是文件还是目录。
因此,您可以将 F 响应传送给 XCOPY 命令,以便该命令不会暂停。
for /f "delims=" %%F in (yourList.txt) do echo f 2>nul | xcopy /y "%%~F" "copyFolder\%%~F"
如果您的列表中有重复项,则使用该/Y
选项 - 您不希望 XCOPY 命令提示询问您是否要覆盖。
如果路径确实存在,则需要将 stderr 重定向到 nul,在这种情况下右侧可能会先于左侧完成,导致左侧将以下错误消息打印到 stderr -The process tried to write to a nonexistent pipe.
重定向隐藏了不需要的错误消息。
另一个选择是在执行 XCOPY 之前先创建目标路径。只需将 stderr 重定向为 null,即可避免在路径已存在时看到错误消息。
for /f "delims=" %%F in (yourList.txt) do (
md "copyFolder%%~pF" 2>nul
xcopy /y "%%~F" "copyFolder\%%~F"
)
对于任何一种解决方案,如果列表中的路径包含驱动器号,则需要使用
"copyFolder%%~pnxF"
而不是"copyFolder\%%~F"
。请注意,~p
修饰符包括前导\
。