2012-11-16 96 views
2

我想通過使用UNC路徑的服務器之間的網絡同步兩個目錄。這些文件是20+ GB。我編寫了一個Powershell腳本來比較兩個目錄,然後將任何缺少的文件複製到另一個。但是,這似乎不起作用。 腳本運行後,它會正確地找到文件,但是當它試圖複製它們時,看起來文件立即被複制(這是不可能的)。即使這些文件在硬盤上佔用了20+ GB的空間,它們也不包含任何數據。Powershell複製項目不適用於unc路徑

$SERVER1 = "SERVER1" 
$SERVER2 = "SERVER2" 
$VDISKPATH = "e$\vdisks" 

#Automatically get vDisks and pvp files in VDISKPATH folder 
$FILES1 = Get-ChildItem -Path \\$SERVER1\$VDISKPATH\* -Include *.vhd,*.pvp 
$FILES2 = Get-ChildItem -Path \\$SERVER2\$VDISKPATH\* -Include *.vhd,*.pvp 

if ($FILES1 -and $FILES2) { 
    $DIFF = Compare-Object -ReferenceObject $FILES1 -DifferenceObject $FILES2 -Property name, length 
} 

# Copy all of the missing files from 
if ($DIFF) { 
    $DIFF | Where-Object { $PSItem.SideIndicator -eq "<="} | ForEach-Object { 
    Copy-Item "\\$SERVER1\$VDISKPATH\$($_.name)" -Destination \\$SERVER2\$VDISKPATH 
    } 
    $DIFF | Where-Object { $PSItem.SideIndicator -eq "=>"} | ForEach-Object { Write-Host "Copying $($_.name) to $SERVER1" | 
    Copy-Item "\\$SERVER2\$VDISKPATH\$($_.name)" -Destination \\$SERVER1\$VDISKPATH 
    } 
Write-Host "All file copies have finished!" 
} 
else { 
    Write-Host "All files are equal" 
    Compare-Object -ReferenceObject $FILES1.name -DifferenceObject $FILES2.name -IncludeEqual 
} 

通常,文件複製(如果手動完成)大約需要15分鐘。我讓腳本運行了90分鐘,並且它從未完成。有人能幫我弄清楚爲什麼這些文件不能正確應對?

回答

0

你的where-object的管道輸出仍然是差異對象。因此,而不是:

$_.name 
在你的foreach

,你想:

$_.InputObject.Name 
+0

我做了變化,但現在只有它複製一個空的虛擬磁盤文件夾而不是複製vhd和pvp文件。 –

+0

@rothgar我只注意到了你的比較對象的-Property參數,所以你的代碼應該可以工作。爲您的copy-item命令添加一個-WhatIf參數,然後查看是否所有參數都按照您的預期展開。 – zdan

+0

我得到'如果:執行操作「複製目錄」目標「項目:\\ SERVER1 \ e $ \ vdisks \目標:\\ SERVER2 \ e $ \ vdisks \ vdisks」'試圖追蹤如果我離開\某處。當我拿出InputObject時 - whatif顯示正確的.pvp和.vhd文件。所以輸入對象以某種方式改變實際傳遞給複製命令的內容。 –

1

我會使用robocopy對於這樣一個任務:

robocopy \\SERVER1\E$\vdisks \\SERVER2\E$\vdisks *.vhd *.pvp /z