我有一个名为 的网络文件共享\\SMWEB\MSDS
,其中包含数百个名为 的子目录 (即 加上一个数字)。每个子目录中可能包含许多文件 — 一些和各种文件。还可能有一个名为 的子目录,其中包含与元数据相关的旧 FrontPage 扩展。但那里MSDSnnnn
MSDS
.html
.jpg
.pdf
_vti_cnf
应该这些子目录中始终至少有一个文件,其名称格式为。 (数字的长度可能不同;例如 或等。)MSDS#.PDF
MSDS99.PDF
MSDS1099.PDF
这些文件可能还存在旧的、过时的版本,所有者在文件前面附加了 (参见图中的红色框 - 此示例中有两个文件的存档版本)。X#_
MSDS0001.PDF
以下是我需要完成的任务:我需要将所有当前的顶级 PDF 文件复制到某个地方(驱动器SDS
上的单个目录H:\
)。我不想复制子文件夹,我只想要具有模式的文件MSDS*.PDF
。(这些文件在上图中以黄色突出显示。)因此我想排除:
- 目录下子目录中的文件(例如,在子目录中),
MSDSnnnn
_vti_cnf
- 名称不以 开头的文件
MSDS
(例如文件),以及X#_
- 名称不以 结尾的文件
.PDF
(例如 HTML 和 JPEG 文件)。
我在 Robocopy 中执行了以下命令:
robocopy \\smweb\msds\ H:\SDS msds*.pdf /S /R:3 /W:3 /NDL /XJD /XD _vti_cnf
问题是 Robocopy 复制了我的H:
驱动器上的文件夹结构。
我怎样才能实现我的目标?
答案1
您是否考虑过使用其他文件复制工具?Robocopy 不支持开箱即用的功能。以下链接讨论了该确切主题:
https://stackoverflow.com/questions/8690245/robocopy-copy-folders-content-to-a-single-folder
你也可以尝试一些简单的方法,例如
for /r \\SMWEB\MSDS %f in (MSDS*.pdf) do @copy "%f" H:\MSDS
答案2
最后,我采取了两步走的方法。
首先,我运行 Robocopy 命令,将所有文件和树结构复制到名为 SDS1 的临时目录,但它排除了包含无关元数据的“_vti_cnf”子文件夹:
robocopy \\smweb\msds\ \\smf4\HOME\gpence-home\SDS1 msds*.pdf /S /R:3 /W:3 /NDL /XJD /XD _vti_cnf
然后我运行了一个 PowerShell 脚本,该脚本通过将文件复制到另一个名为 SDS2 的目录来删除树中的子文件夹。(-WhatIf 参数显示结果而不实际执行命令。当您准备好“真正”执行命令时,只需删除该参数即可。)
get-ChildItem -Path "\\smf4\HOME\gpence-home\SDS1\msds*.pdf" -Recurse | Copy-Item -Destination "\\smf4\HOME\gpence-home\SDS2" -WhatIf
这对我很有效。