我正在寻找一种解决方案,使用 robocopy 将目录中的多个文件夹复制到远程网络共享。我想从包含数百个我不感兴趣的文件夹的目录中选择几个文件夹。我想使用正则表达式在 linux 中执行类似于 scp 的操作,但这在 robocopy 中不起作用:
c:\robocopy "c:\results\1319_TC1.*" "\\datastore\somefolder\"
答案1
尝试一下这个:
gci C:\results\1319_TC1.* | foreach-object { robocopy $_.fullname (".\datastore\somefolder\" + $_.name) }
gci C:\results\1319_TC1.*
首先获取所有匹配的文件/目录,然后将它们放入管道中,管道foreach-object
负责处理第一个命令的所有结果。它将复制每个结果的完整路径(结果目录的完整路径),并将它们放入 .\datastore\somefolder\ 及其原始文件夹名称中,例如:
C:\results\1319_TC1.123456
->C:\results\datastore\somefolder\1319_TC1.123456
括号中的内容将目标目录名称和原始文件夹名称放在一起。
编辑:
我刚刚看到您的目标目录应该是 UNC 路径。Robocopy 接受 UNC 路径(即使路径名长度超过 256 个字符)。您只需在我的命令中替换为(".\datastore\somefolder\"
。("\\datastore\somefolder\"
因此正确的命令应该是:
gci C:\results\1319_TC1.* | foreach-object { robocopy $_.fullname ("\\datastore\somefolder\" + $_.name) }
答案2
您可以在批处理文件中执行此操作。每个目录都需要一行。
另外,您可以这样做,将复制所有内容,然后删除多余的内容(如果这样更容易):Robocopy z:\directory d:\directory /MIR /COPYALL(注意:MIR 用于镜像,将覆盖其路径上的所有内容,因此只能在空白目录上使用)。
答案3
仅使用 Robocopy 无法完成此操作。如果您可以访问 Linux 计算机,则使用find
该-exec
选项将非常容易。或者您可以在 Windows 上使用 cygwin(我猜它有 find 命令),或者您可以在 Windows 上使用 Ruby 或 Python 等脚本语言。
答案4
Robocopy 特别不支持包含模式,但它支持排除模式。它还支持仅复制已在目标目录中镜像的文件和文件夹,因此您可以将两者结合起来以实现灵活的解决方案,以仅包含具有特定模式的文件夹。
这个答案改编自 John 的精彩回答:https://community.spiceworks.com/topic/70361-robocopy-folder-wildcard
您希望拥有什么:
robocopy mySrc myDest /S /IncludeFolders 1319_TC1.*
你实际上可以做什么:
robocopy mySrc myDest /E /CREATE
robocopy myDest DeleteMe /E /MOVE /XD 1319_TC1.*
robocopy mySrc myDest /S /XL
rd DeleteMe /s
解释
步骤 1 创建整个源的副本,但所有文件都是 0 字节(没有实际的数据移动)
第 2 步将所有不是目标模式的文件夹移出到某个临时文件夹中(即所有不以 1319_TC1 开头的文件夹)。
步骤 3 进行实际复制,仅将目标中已有的文件从源复制到目标
步骤 4 删除不需要的 0 字节文件
这是一个非常棒的解决方案,因为它只会有效地复制您想要的文件,但大大增加了原始 robocopy 中可用的表现力,天才!