将多个文件夹及其子文件夹批量复制到合并文件夹中


1

我有一个文件夹 X:\Export 有几个文件夹:

X:\Export
+---Export1
|   \--- 各种档案......  + --- Export2
| \ ---  ...和子文件夹  + --- Export3
| \ ---  等等  \ ---  等(名称差异很大) 

每个“导出”文件夹具有相同的子目录结构,但它们具有不同的文件(可能存在一些名称冲突)。我想复制所有的子文件夹和文件 X:\Export\Export1X:\Export\Export2X:\Export\Export3等等,到一个文件夹 X:\Export\merged,保持子目录结构。

我希望做的伪代码却无法正常工作:

create new folder "merged"
for (every folder X in a given directory Y (i.e., X:\Export)
    copy every file in X keeping directory structure to "merged"
If conflict then overwrite

Answers:


1

怎么样

@echo off
md merged
for /f "delims=" %%f in ('dir /b /ad') do (
    if not %%f==merged xcopy "%%f" merged /s /y
)

/y 选项会导致文件被覆盖而无需确认。更换 /s/e 如果要复制空子目录。


补充说明: for /f " 选项 (可选的) 变量 in(' 命令 “) 运行 命令 ,捕获输出,从该输出分配令牌(字符串)到变量,然后运行命令后 dodir /b 表示只显示文件名(没有属性,没有 ... ); dir /ad 表示仅列出目录(无文件)。

的默认行为 for /f 是通过将所有字符都放到第一个空格来从每行输出创建一个标记。该 "delims=" 选项 告诉它采取整行。即使您的目录名称中包含空格,这一点偏执也会使脚本生效。我可能已经说完了 xcopy %%f merged;但我需要双引号 %%fxcopy %%F 合并的 )处理案件在哪里 %%f 包含空格。


如果从该目录通过命令提示符运行,它可以工作,但是如果通过运行.bat文件运行它默认为c:\ Windows。我怎么能让它在.bat所在的目录中运行忘了提到偶尔这是在网络驱动器上。
DjLenny

@DjLenny:“......如果通过运行.bat文件运行它默认为C:\ Windows。”我不明白为什么会发生这种情况或为什么会发生这种情况 - 你运行的是什么版本的Windows?但要解决问题,请提出一个问题 cd 进入剧本;例如。, cd/d X:\Export。如果您需要能够在不同的位置使用它,请进行争论( cd/d %1 )。
Scott

wondows 7,我想出了我的问题,如果我在本地运行它可行,如果它在Unmapped网络驱动器上它不起作用,因为该文件的UNC地址。一旦我映射驱动器它工作得很好,它也在powershell中工作。谢谢你的剧本,就像一个魅力。现在是一个未来理解的问题:“delims =”和('dir / b / ad')与我理解的其余部分的相关性是什么?
DjLenny

@DjLenny:我在答案中添加了更多解释。 (您可以通过输入获得更多信息 dir /?for /?。)如果我的答案解决了你的问题,请“接受”它。
Scott
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.