PowerShell中的Compare-Object,如何从两个方面返回对象"?

时间:2015-04-21 20:46:28

标签: powershell

我有一个问题,我正在尝试使用PowerShell脚本解决。我在不同的地理位置有两台服务器,包含一些文件。问题是,两地的文件结构不同,站点之间的带宽非常低。服务器1具有正确的结构,并且服务器2具有不正确的结构,但许多相同的文件。

例如,

服务器1的路径为C:\ Data \ Adob​​e \ 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的路径,这样我就可以进行一些字符串操作并在两边构建等效路径,但我无法弄清楚如何将两个值都恢复

非常感谢任何帮助

1 个答案:

答案 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
    }
}