我想将多个文件夹中的多个文件从一个硬盘 A 复制到另一个硬盘 B。
我怎样才能仅将文件从 A 复制到 B,并且如果文件已存在于 B 中则跳过复制?
使用 xcopy 可以实现这个吗?
答案1
您可以通过管道传输源的递归 GCI 的结果,测试它是否是文件夹或文件,然后使用此对象来测试路径以检查是否存在于目标文件夹中。
就像是 ...
# Initial setup defaults
$Start = Date # Uses this start time at the end to calculate how long the process took!
$src = 'C:\Original Folder'
$dest = 'D:\New Folder'
Get-ChildItem -Path $src -Recurse |
% {
If ($_.PSIsContainer)
{ If (Test-Path (Join-Path (Join-Path $dest $_.Parent.FullName.SubString($src.Length)) $_.BaseName)){
}Else{
$_ | Copy-Item -Destination {Join-Path $dest $_.Parent.FullName.Substring($src.length)} -Force #-Whatif
}
}Else{
If (Test-Path (Join-Path $dest $_.FullName.SubString($src.Length))){
}Else{
$_ | Copy-Item -Destination {Join-Path $dest $_.FullName.Substring($src.length)} -Force #-Whatif
}
}
} -ErrorAction Continue
$End = Date
$TimeDiff = New-TimeSpan $Start $End
$Difference = "{0:G}" -f $TimeDiff
Write-Host " Scan time " $Difference " [(Days) Hours Minutes Seconds]"
如果文件上的测试路径成功,但文件名称相同但时间戳不同,那么您将需要实现文件之间的某种比较或检查文件上次写入时间,如下所示
If ($_.LastWriteTime -gt ((Join-Path $dest $_.FullName.SubString($src.Length)).LastWriteTime)){ $_ | Copy-Item -Destination {Join-Path $dest $_.FullName.Substring($src.length) }}