我尝试制作一个比较两个目录(源,目标)的脚本,如果目标存在差异,则将文件从源复制到目标。 问题是我不知道如何复制文件树。
示例:
$s = "C:\source\client"
$t = "C:\destination\client"
$target = Get-ChildItem $t -Recurse
$source = get-childitem $s -Recurse
Compare-Object $source $target -Property Name , Length |
Where-Object { $_.SideIndicator -eq '<=' } |
foreach-object -process{
copy-item $_.FullName -destination $t
}
如果我在源文件中有一个文件(C:\ source \ client \ bin \ file.txt)而不是在目标文件夹中,那么如何在C:\ destination \ client \ bin \ file中复制该文件的代码.txt?
感谢。
答案 0 :(得分:2)
我正在测试这个。从我可以看到你的代码的逻辑是合理的。
Compare-Object $source $target -Property Name , Length |
Where-Object { $_.SideIndicator -eq '<=' } | Select-Object -ExpandProperty inputobject |
foreach-object -process{
copy-item $_.FullName -destination $t
}
比较完成后,在Where
Select-Object -ExpandProperty inputobject
之后的结果中提取文件项,以便您可以看到FullName
属性
答案 1 :(得分:1)
copy-item有一个-recurse参数,可以让你指定目录的根目录然后复制它下面的所有内容
copy-item c:\test d:\test -recurse -force
编辑: 问题是重复的任务,你不能阻止它试图覆盖一切。你可以添加-force来实现它,但效率不高。
或者(可能是更好更简单的方法)你可以使用/ mir开关调用robocopy
答案 2 :(得分:1)
感谢分享。以下是我搜索的所有内容,比较MD5,然后只复制新添加的和不同的文件。
使用[{3}}
中的[使用PowerShell Get-FileHash比较两个文件夹的内容]$LeftFolder = "D:\YFMS_Target"
$RightFolder = "D:\YFMS_Copy"
$LeftSideHash = @(Get-ChildItem $LeftFolder -Recurse | Get-FileHash -Algorithm MD5| select @{Label="Path";Expression={$_.Path.Replace($LeftFolder,"")}},Hash)
$RightSideHash = @(Get-ChildItem $RightFolder -Recurse | Get-FileHash -Algorithm MD5| select @{Label="Path";Expression={$_.Path.Replace($RightFolder,"")}},Hash)
robocopy $LeftFolder $RightFolder /e /xf *
Write-Host "robocopy LastExitCode: $LastExitCode"
if ($LastExitCode -gt 7) { exit $LastExitCode } else { $global:LastExitCode = $null }
Compare-Object $LeftSideHash $RightSideHash -Property Path,Hash | Where-Object { $_.SideIndicator -eq '<=' } | foreach { Copy-Item -LiteralPath (Join-Path $LeftFolder $_.Path) -Destination (Join-Path $RightFolder $_.Path) -verbose}