根据名称复制文件的批处理脚本

Posted

技术标签:

【中文标题】根据名称复制文件的批处理脚本【英文标题】:Batch script for copying files based on name 【发布时间】:2019-04-20 08:53:48 【问题描述】:

基本上我想编写一个小批处理脚本来执行以下操作 - 我有两个文件夹,A 和 B...A 有 10 个文件,B 有 100 个。我想比较每个文件夹中文件的名称和如果B中的任何与A中的名称相同,则将它们复制到文件夹A并覆盖原始文件。

我试图通过在文件夹 A 上执行“for”命令开始,但随后我必须使用 IF 来比较我不知道如何正确表达的文件名

    for /r "C:\folderA" %%a in (*.filetype) do (...)

抱歉,我对批处理脚本毫无用处。我发现了几个讨论类似问题的线程,但 rly 没有按照答案提供足够的帮助。

这很难吗?比较两个文件名的其他线程看起来有点复杂。

感谢您的帮助:)

【问题讨论】:

你试过RoboCopy/XL吗?或XCopy/U 阅读整个help for,尤其是带有~修饰符的部分。几乎被遗忘的help replace 仍然存在 ...如果我花时间回答这个问题却发现它已经在 cmets 中得到回答,就会发生这种情况:-) 虽然它更冗长,但不会删除答案。 @JackWhite 在评论中有答案的问题仍在“未回答队列”中。所以是的,保留你的答案(但更正源/目标顺序) 好的,已更正来源/目的地。 【参考方案1】:

试试这个:

xcopy /s /u /y /i /r /c "C:\folderB\*.filetype" "C:\folderA"
/s 复制文件夹和子文件夹 /u 仅复制两个文件夹中预先存在的文件 /y 禁止提示覆盖文件 /i 告诉 xcopy 目的地是一个文件夹 /r 忽略 READONLY 属性以防万一(这是可选的) /c 即使发生错误也会继续复制(这是可选的)

关于 xcopy 的更多信息可以在here(或xcopy /?)找到

如果这对你不起作用,那么应该这样做:

for /r "C:\folderA" %%a in (*.filetype) do if exist "C:\folderB\%%~nxa" copy /y "C:\folderB\%%~nxa" "C:\folderA\%%~nxa"

这是它的作用:

if exist 检查文件是否存在 它检查的路径由folderA 路径和在folderB 中找到的文件的名称和扩展名组成 copy /y 复制文件覆盖现有文件 来自folderB 中的原始文件 到folderA 中找到的类似名称的文件

%%~dpnxa 语法如下:

%%SOMETHINGa 表示这是一个 for 循环变量 ~ 禁止文件名周围的双引号(我们将提供我们自己的) d 用于磁盘 (c:) p 是包含文件夹的路径 (\folderA\) n 是文件名(即readmex 用于扩展(即.txt

您可以随意混合搭配。更多信息是here 或尝试for /?

如果逻辑需要更复杂,我建议使用 ( ) 括号 + delayed expansion 或 call :label (call /?)

更新:更正了 FolderAFolderB 的混淆

【讨论】:

要求不是folderB=source和folderA=destination吗? 非常感谢您的详细回答!所以我尝试了你建议的一切。使用 xcopy 的第一个命令在我第一次尝试时不起作用,给出了“无法执行循环复制”之类的错误-我只是再次尝试以获取确切的错误,并且第二次起作用了……所以我不知道是什么我第二次做了不同的事情。第二种方法也很好,除了从文件夹 A 复制到文件夹 B,所以我只需要反转所有内容即可工作,但无论哪种方式都很棒。非常感谢杰克,非常感谢! 如果目标是源的子文件夹,您只会收到循环复制错误 对不起,我误读并编写了从 A -> B 复制的代码。我已更正了代码。如果文件夹 A 是文件夹 B 的子文件夹,则它可能不起作用,反之亦然。如果确实如此,请详细说明您要完成的工作。 完美,魅力无穷。文件夹的位置不是问题,因为如果需要我可以移动它们,通常我只是把它们放在 C:\ 附近的某个地方,所以我不必输入长路径。所以刚刚将两个文件夹放在同一个目录中。

以上是关于根据名称复制文件的批处理脚本的主要内容,如果未能解决你的问题,请参考以下文章

Windows批处理脚本:查找目录中最后一个文件夹的名称[关闭]

将批处理脚本中的目录更改为没有名称的文件夹

NANT 复制所有具有相似名称的文件

如何处理文件夹结构中与模式匹配的所有文件? [复制]

根据来自 Sql 的变量处理多个脚本

用于复制大于 700MB 的最新文件的批处理脚本