Powershell比较对象

时间:2014-09-12 12:15:49

标签: powershell

我尝试制作一个比较两个目录(源,目标)的脚本,如果目标存在差异,则将文件从源复制到目标。 问题是我不知道如何复制文件树。

示例:

$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?

感谢。

3 个答案:

答案 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}