我有一个问题,我正在尝试使用PowerShell脚本解决。我在不同的地理位置有两台服务器,包含一些文件。问题是,两地的文件结构不同,站点之间的带宽非常低。服务器1具有正确的结构,并且服务器2具有不正确的结构,但许多相同的文件。
例如,
服务器1的路径为C:\ Data \ Adobe \ Reader.exe 服务器2具有路径C:\ Stuff \ PDF Reader \ 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的顺序。例如,在此示例中,输出如下:
\\ server2 \ c $ \ Stuff \ PDF Reader \ Acrobat \ Reader.exe
我需要输出相同项目的两个路径:
\\ SERVER1 \ C $ \数据\的Adobe \ Reader.exe
\\ server2 \ c $ \ Stuff \ PDF Reader \ Acrobat \ Reader.exe
我希望返回server1和server2的路径,这样我就可以进行一些字符串操作并在两边构建等效路径,但我无法弄清楚如何将两个值都恢复
非常感谢任何帮助
答案 0 :(得分:0)
我不认为使用Compare-Object可以做到这一点。您可以通过从一个源构建哈希表,然后将第二个源与哈希表进行比较来获得所需的结果。我之前使用过这种方法,但不是用于文件。
$oldsource = Get-ChildItem -recurse "\\server1\c$\Data"
$newsource = Get-ChildItem -recurse "\\server2\c$\Stuff"
$hashlist=@{}
$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
}
}