2014-09-12 137 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}