Robocopy不会复制根文件夹及其时间戳


10

Robocopy不会复制根文件夹及其时间戳-它会复制所有子目录和文件(在设置了相应选项时),似乎没有选项/参数告诉Robocopy您想要根文件夹本身及其时间戳或属性也要逐字复制。

所以说我要复制C:/ Brushes

Robocopy会将所有子目录和文件复制到目标位置,但不复制Brushes文件夹本身,并复制所有相关属性和时间戳。

你明白我在问什么吗?这是非常基本的,Robocopy似乎缺少选择。人们以前曾在各种论坛上提出过这个问题,但就我而言,没有人回答过这个问题。

在此处输入图片说明


1
这是一张传单,根据我的使用经验rsync,但是如果目标文件夹末尾没有斜杠怎么办?如何尝试在命令行级别而不是使用GUI修改脚本?我知道命令行工具可以满足您的需求。

@Randolph West:目前我在目标文件夹的末尾没有斜杠。我仍然无法使Robocopy在实际的复制作业中包含源文件夹及其属性等。有任何想法吗?
ptrcao 2012年

如果没有针对robocopy的解决方案,则可以查看xxcopy(有免费软件和商业版本)。
harrymc

是的,我完全理解,并在下面添加了一个可行的解决方案。真正的问题是,您必须在根目录中指定所有文件和文件夹而不要复制。
opsin 2012年

Answers:


9
robocopy %1 "C:\DestinationDirectory\%~n1" /E /V /DCOPY:T /LOG:"C:\DestinationDirectory\Copied.txt" /R:10 /W:30 

将文件夹放到bat或在发送到中使用。它将创建带有源目录名称和时间戳的文件夹并复制所有文件。


非常感谢您,正在寻找那个神奇的%
〜n1

@hotzen,怎么%~n1办?
Pacerier


“将%1扩展为文件名。”
hotzen 2015年


3

我同意OP,无法复制根文件夹是robocopy的一大缺点。作弊并将笔刷文件夹移动到临时文件夹,对临时文件夹执行robocopy操作,然后再将其移回怎么样?

就像是:

md "c:\verytemporary" && move "c:\brushes" "C:\verytemporary"||( echo Line 1 error occurred & goto :eof )
robocopy c:\verytemporary d:\ /MIR /DCOPY:T
move "c:\verytemporary\brushes" "c:\" && rd /q "c:\verytemporary"||echo Line 3 error occurred

2

md D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushes从命令行尝试,替换正确的路径。


3
是的,但是您正在创建一个新文件夹,该文件夹将不具有原始C:\ brushes文件夹的属性...?
ptrcao 2012年

2

如我所见,在任何答案中都没有好的简便的解决方案:

如果没有针对robocopy的解决方案,则可以查看xxcopy(有免费软件和商业版本)。

当然,还有很多其他替代robocopy的方法,这里列出一些。
另请参阅最佳免费文件复制实用程序


1
xxcopy是一个很棒的实用程序,但是免费软件版本会提示您,如果使用大量命令行开关中的任何一个,则必须进行响应。xxcopy在命令窗口中使用此额外提示很烦人。但是,它完全阻止xxcopy了批处理文件的使用(使之复杂)。
凯文·费根

1

user105198的答案是一半,

D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushes 确实会创建一个新文件夹。您将需要追加/ MIR和/ DCOPY:T

使用/ mir选项,如果目标目录存在,则目标目录安全设置将被覆盖。科技网

/DCOPY:T :: COPY Directory Timestamps.

组合在一起意味着:源目录的属性和时间戳将镜像到创建的文件夹。

所以:

D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushes /MIR /DCOPY:T

1

我想您会发现Robocopy确实可以满足您的要求,只要您告诉它复制文件夹时间戳(/ DCOPY:T)。从我的实验中,我发现以下行为(看似未记录)对于Robocopy是正确的:

源目录的所有指定属性都将应用到目标目录,而不管目标目录是否存在,不存在或者名称与源目录不同。

指定的属性可以包括(至少)安全信息(/ SEC)或文件夹时间戳(/ DCOPY:T)。

因此,在以下示例中,将为c:\ destination \ folder分配与c:\ source \ folder相同的时间戳。

robocopy c:\source\folder C:\destination\folder /E /DCOPY:T

我使用Windows 7,Windows 8和Windows 2003 Resource Kit(仅/ SEC参数)随附的Robocopy版本进行了测试。请注意,只有较新版本的Robocopy(XP026和更高版本)才支持/ DCOPY:T参数。


0

如果结合/IF :: Include the following Files.使用,/E :: copy subdirectories, including Empty ones.您将获得(接近)所需的效果:

C:\Temp\Robocopy Source Root>robocopy . "C:\Temp\Robocopy Destination" /E /IF "Brushes*"

1
您是什么意思“接近”?您暗示的限制是什么?
ptrcao 2012年

危险威尔·鲁滨逊!!!您的建议似乎是复制当前文件夹中的每个文件夹,而不是将其限制为以“画笔”开头的文件夹
GlennFromIowa 2013年

0

Robocopy并不是真的很容易做到这一点。但是,有一种方法。

根文件夹包含50个文件和40个文件夹。您只需要文件夹X(但是您也想要它的时间和日期戳)。

ROBOCOPY c:\ d:\ /XF 50 root file names c:\boot.ini c:\bla.txt etc. /XD c:\windows c:\drivers c:\temp etc. /S /E /SEC /DCOPY:T

/ DCOPY:T告诉它保留文件夹时间戳。/ XF指定不复制哪些文件,/ XD指定不复制哪些文件夹。只是不指定文件夹c:\ X。

这样做的主要缺点是研究根目录中的所有文件夹和文件名,并在此处专门调用它们。如果您在不同的系统上经常执行此操作,则可以编写脚本。

工作实例

robocopy c:\ testing c:\ abc / XF c:\ testing \ Testing.txt / XD“ C:\ testing \ New Folder(2)”“ C:\ testing \ New Folder(3)” / S / E / SEC / DCOPY:T

根工作示例

robocopy c:\ d:\ / XF c:\ Testing.txt / XD“ C:\ New Folder(2)”“ C:\ New Folder(3)” / S / E / SEC / DCOPY:T

我的测试成功了,我创建了几个文件夹和子文件夹,在这种情况下,c:\ test是根目录,c:\ abc是另一个驱动器的根目录(显然它们不是真的,但是为此,它应该是有道理的)。我从根目录获得的文件夹称为“新文件夹”,您可以看到我没有在/ XD中指定它。另外,请确保指定c:\,否则您使用的名称将是全局名称。换句话说,如果我没有从Testing.txt文件中指定c:\ testing in,它将在所有要复制的子文件夹中将其忽略。/ SEC将复制所有文件安全性和时间戳。


嗯,我想您可以使用/ XF c:*。*排除所有根文件。我将在机器前而不是手机上进行测试。
opsin

否,c:*。*无效,您必须手动列出所有文件。
opsin

0

从理论上讲,使用/DCOPY:T应该可以解决所有问题。

但是,我已经看到了这种情况的发生,并且不确定将其称为“错误”,而是操作顺序(确定,错误)的结果。

此命令应该可以将所有文件从复制C:\BrushesD:\NEWBrushes,并且/DCOPY:T应该将源文件夹的时间戳复制到目标文件夹:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T

我所看到的(至少在某些Robocopy版本上)是命令成功执行,但是D:\NEWBrushes文件夹的时间戳设置为当前日期和时间。

因此,该/DCOPY:T功能似乎不适用于您要复制的“基础”(最顶层)文件夹。

我相信它正在运行,但是目标文件夹的时间戳正在通过操作序列中后面的操作“加紧”。

我相信此命令正在发生什么:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T

是这样的:

  1. 创建文件夹(D:\NEWBrushes如果尚不存在)
  2. 将时间戳记从复制C:\BrushesD:\NEWBrushes
  3. 将文件和子文件夹从复制C:\BrushesD:\NEWBrushes

看来,步骤3(对文件夹内容的修改)D:\NEWBrushes导致时间戳记的D:\NEWBrushes改变。

对我而言,“解决方法”是运行robocopy命令以复制文件和文件夹,然后再次运行(相同)robocopy命令。

因此,第一次运行:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T

所有文件和文件夹都将被复制。然后再次运行它:

robocopy "C:\Brushes" "D:\NEWBrushes" /COPY:DAT /DCOPY:T
  (or)
robocopy "C:\Brushes" "D:\NEWBrushes" /DCOPY:T

第二次robocopy运行时,其中的文件或文件夹都D:\NEWBrushes不会被修改,并且该/DCOPY:T选项将告诉robocopy您将时间戳记从复制C:\BrushesD:\NEWBrushes(除非C:\Brushes第一次运行以来其中的文件夹/文件已更改robocopy)。


-1

我现在正在用robocopy解决一个真正快速,简单的备份脚本的根文件夹,有一个例子。应该帮助任何人:

$Destination="F:\Backup" #change destionation backup drive and foder
$BackupDirs="d:\folder1", "d:\folder2", "d:\folder3\subfolder", "d:\fodler4\subfolder\subsubfodler" #change source folders

#make a loop for every source folder
foreach ($Backup in $BackupDirs) {

#split folder name
$fdname = Split-Path $Backup -leaf

#define folder to create in destionation
$dirtocreate = Join-Path $Destination $fdname

#make directory, yes, some extra script to skip when exist should be in place, but -erroraction solved this in lazy mode :)
md $dirtocreate -ErrorAction SilentlyContinue 

#copy with subfolders and log
robocopy $backup $dirtocreate  /s /nfl /ndl /log:c:\scripts\backup.log

}

因此,使用此PowerScript即可解决问题,对吗?
皮条客果汁IT
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.