2014-09-12 121 views
0

我试图做一个脚本比较两个目录(源,目的地),如果目标上有差异,将文件从源文件复制到目标文件。 问题是我不知道如何复制文件树。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:\源\客户\ BIN \ file.txt的),而不是在目标文件夹,如何是复制的文件中的代码C:\ destination \ client \ bin \ file.txt?

谢谢。

+0

[使用PowerShell获取-FileHash比较两个文件夹的内容]有什么你想在'$ t'目录保存?你也可以直接拷贝一份。 'Copy-Item -Path $ s -Destination $ t -recurse -Force'如果目录非常大,这将不是理想的。这个评论更多的是关于我的第一个问题,而不是“复制项目”的评论。 – Matt 2014-09-12 12:35:04

+0

我只想复制比较对象返回的文件或文件夹 – cmiscloni 2014-09-12 12:52:10

回答

2

我在测试这个更多的过程。从我可以看到你的代码的逻辑是健全的。

Compare-Object $source $target -Property Name , Length | 
    Where-Object { $_.SideIndicator -eq '<=' } | Select-Object -ExpandProperty inputobject | 
    foreach-object -process{ 
     copy-item $_.FullName -destination $t 
} 

一旦你拥有了比较完成管在Select-Object -ExpandProperty inputobjectWhere后的结果,以提取文件的项目,这样就可以看到FullName财产

1

复制项目有-recurse参数,可以让你指定一个目录的根目录,然后复制下面的一切它

copy-item c:\test d:\test -recurse -force 

编辑: 问题是重复的任务,你不能阻止它从试图覆盖一切。您可以添加-force以实现它,但效率不高。

或者(和可能是一个更好的,更简单的方式去了解这一点),你可以调用ROBOCOPY与/ MIR开关

+1

对于假设OP想要覆盖预先存在的文件的robocopy。在问题中,如果文件不存在于目标文件中,它只会复制文件。如果目标中的文件不同,则Robocopy会复制。我猜想robocopy是一个更优雅的解决方案。 – Matt 2014-09-12 12:29:18

+0

我同意......实际上是编辑我的答案,以说明你的评论。至少在我提出替代方案之前,我只想回答他最初的问题。 – 2014-09-12 12:30:44

1

感谢分享。以下是我对搜索到的所有内容进行了比较,然后仅复制新添加的和不同的文件。

http://almoselhy.azurewebsites.net/2014/12/compare-contents-of-two-folders-using-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}