Robocopy不会复制根文件夹及其时间戳-它会复制所有子目录和文件(在设置了相应选项时),似乎没有选项/参数告诉Robocopy您想要根文件夹本身及其时间戳或属性也要逐字复制。
所以说我要复制C:/ Brushes
Robocopy会将所有子目录和文件复制到目标位置,但不复制Brushes文件夹本身,并复制所有相关属性和时间戳。
你明白我在问什么吗?这是非常基本的,Robocopy似乎缺少选择。人们以前曾在各种论坛上提出过这个问题,但就我而言,没有人回答过这个问题。
Robocopy不会复制根文件夹及其时间戳-它会复制所有子目录和文件(在设置了相应选项时),似乎没有选项/参数告诉Robocopy您想要根文件夹本身及其时间戳或属性也要逐字复制。
所以说我要复制C:/ Brushes
Robocopy会将所有子目录和文件复制到目标位置,但不复制Brushes文件夹本身,并复制所有相关属性和时间戳。
你明白我在问什么吗?这是非常基本的,Robocopy似乎缺少选择。人们以前曾在各种论坛上提出过这个问题,但就我而言,没有人回答过这个问题。
Answers:
robocopy %1 "C:\DestinationDirectory\%~n1" /E /V /DCOPY:T /LOG:"C:\DestinationDirectory\Copied.txt" /R:10 /W:30
将文件夹放到bat
或在发送到中使用。它将创建带有源目录名称和时间戳的文件夹并复制所有文件。
%~n1
办?
我同意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
md D:\Backup\Brushes && robocopy C:\brushes D:\Backup\Brushes
从命令行尝试,替换正确的路径。
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
我想您会发现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参数。
如果结合/IF :: Include the following Files.
使用,/E :: copy subdirectories, including Empty ones.
您将获得(接近)所需的效果:
C:\Temp\Robocopy Source Root>robocopy . "C:\Temp\Robocopy Destination" /E /IF "Brushes*"
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将复制所有文件安全性和时间戳。
从理论上讲,使用/DCOPY:T
应该可以解决所有问题。
但是,我已经看到了这种情况的发生,并且不确定将其称为“错误”,而是操作顺序(确定,错误)的结果。
此命令应该可以将所有文件从复制C:\Brushes
到D:\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
是这样的:
D:\NEWBrushes
如果尚不存在)C:\Brushes
到D:\NEWBrushes
C:\Brushes
到D:\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:\Brushes
到D:\NEWBrushes
(除非C:\Brushes
第一次运行以来其中的文件夹/文件已更改robocopy
)。
我现在正在用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
}
rsync
,但是如果目标文件夹末尾没有斜杠怎么办?如何尝试在命令行级别而不是使用GUI修改脚本?我知道命令行工具可以满足您的需求。