2012-11-16 46 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