根据名称复制文件的批处理脚本
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
是文件名(即readme
)
x
用于扩展(即.txt
)
您可以随意混合搭配。更多信息是here 或尝试for /?
如果逻辑需要更复杂,我建议使用 (
)
括号 + delayed expansion 或 call :label
(call /?
)
更新:更正了 FolderA
和 FolderB
的混淆
【讨论】:
要求不是folderB
=source和folderA
=destination吗?
非常感谢您的详细回答!所以我尝试了你建议的一切。使用 xcopy 的第一个命令在我第一次尝试时不起作用,给出了“无法执行循环复制”之类的错误-我只是再次尝试以获取确切的错误,并且第二次起作用了……所以我不知道是什么我第二次做了不同的事情。第二种方法也很好,除了从文件夹 A 复制到文件夹 B,所以我只需要反转所有内容即可工作,但无论哪种方式都很棒。非常感谢杰克,非常感谢!
如果目标是源的子文件夹,您只会收到循环复制错误
对不起,我误读并编写了从 A -> B 复制的代码。我已更正了代码。如果文件夹 A 是文件夹 B 的子文件夹,则它可能不起作用,反之亦然。如果确实如此,请详细说明您要完成的工作。
完美,魅力无穷。文件夹的位置不是问题,因为如果需要我可以移动它们,通常我只是把它们放在 C:\ 附近的某个地方,所以我不必输入长路径。所以刚刚将两个文件夹放在同一个目录中。以上是关于根据名称复制文件的批处理脚本的主要内容,如果未能解决你的问题,请参考以下文章