2015-04-21 141 views
0

我有一個問題,我試圖解決PowerShell腳本。我有兩臺服務器在不同的地理位置包含一些文件。問題是,這兩個地方的文件結構是不同的,網站之間的帶寬非常低。服務器1具有正確的結構,並且服務器2具有不正確的結構,但許多相同的文件。PowerShell比較對象,如何從兩個「方」返回對象?

例如,

服務器1路徑爲C:\ DATA \的Adobe \ Reader.exe 服務器2路徑爲C:\東西\ PDF閱讀器\ Acrobat中\ Reader.exe

我想要將服務器2的C:\ Stuff文件夾中的文件(僅複製相同的文件)複製到類似服務器1的結構中,以便在服務器2上將文件複製到C:\ Data,以便在互聯網上保存大量文件副本。

這是我到目前爲止有:

$oldsource = Get-ChildItem -recurse "\\server1\c$\Data" 
$newsource = Get-ChildItem -recurse "\\server2\c$\Stuff" 

Compare-Object -ReferenceObject $newsource -DifferenceObject $oldsource - Property Name,Length -ExcludeDifferent -IncludeEqual -PassThru | 
    Where-Object { $_.SideIndicator -eq '==' } | 
    foreach-object -process{ 
    Write-Host $_.FullName 
     } 

我還沒有進一步的進展,因爲我的命令只輸出一個比較的「半壁江山」,這取決於訂購-ReferenceObject和-DifferenceObject是。例如,在這個例子中,輸出將如下所示:

\\服務器2 \ C $ \東西\ PDF閱讀器\ Acrobat中\ Reader.exe

我需要爲同一項目的兩個路徑的輸出:

\\ server1的\ C $ \數據\的Adobe \ Reader.exe

\\服務器2 \ C $ \東西\ PDF閱讀器\ Acrobat中\ Reader.exe

我想返回兩個路徑對於server1和server2,我可以做一些字符串操作,並在sid上構建等效路徑E,但我無法弄清楚如何讓這兩個值回

任何幫助是極大的讚賞

+0

您是否嘗試過任何類似-IncludeEqual的開關? –

回答

0

我不認爲這是可能做到這一點與比較-對象。您可以通過從一個源創建哈希列表,然後將第二個源與哈希列表進行比較來獲得期望的結果。我之前使用過這種方法,但不是用於文件。

$oldsource = Get-ChildItem -recurse "\\server1\c$\Data" 
$newsource = Get-ChildItem -recurse "\\server2\c$\Stuff" 

[email protected]{} 
$oldsource | foreach-object { $hashlist.add($_.name+$_.length,$_.fullname) } 
foreach ($newitem in $newsource) 
{ 
    $oldmatch=$hashlist.item($newitem.name+$newitem.length) 
    if ($oldmatch) 
    { 
     write-host $oldmatch 
     write-host $newitem.fullname 
    } 
}