【问题标题】: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 在评论中有答案的问题仍在“未回答队列”中。所以是的,保留你的答案(但更正源/目标顺序)
  • 好的,已更正来源/目的地。

标签: batch-file copy compare filenames


【解决方案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 是文件名(即readme
  • x 用于扩展(即.txt

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

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

更新:更正了 FolderAFolderB 的混淆

【讨论】:

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