在比较对象的同一结果集中进行比较

时间:2018-10-22 21:51:33

标签: powershell powershell-v4.0

我有一个CSV文件,其中包含一个存储设备上每个文件的名称,大小和哈希(文件名,大小(以字节为单位)和MD5哈希)。移动此数据后,我将为每个文件生成哈希,还包括名称和大小,然后将这些列与现有CSV中的列进行比较。我知道那里有实用程序可以为我完成所有这些工作,但是我做这件事是一种学习体验,而不是其他任何事情。

我想做的是查找与文件名,大小和哈希值不完全匹配的文件,我想导出一个日志,指示该文件在新位置上是否不存在,或者是否存在哈希不匹配。

例如,使用我当前的比较脚本:

workbench.colorCustomizations

我得到:

$csv1 = Import-CSV "X:\Documents\Customer Projects\Destination.csv"
$csv2 = Import-CSV "X:\Documents\Customer Projects\Source.csv"
Compare-Object -ReferenceObject $csv2 -DifferenceObject $csv1 -Property Name,Size,Hash

对于第一个文件Name Size Hash SideIndicator ---- ---- ---- ------------- 123456789.avi 4122896 D258518EDDE5F00579CE2F9D01129C11 => 123456789.avi 8635210 807666D37D0E1A75279E1AE837759674 <= qwertyuiop.avi 468246867 3F779E039B646D49D84F3D2C403F2EBD <= ,在两个位置都可以找到它,但是大小和哈希值不匹配,应该沿123456789.avi的行记录内容。

对于第二个文件"Hash mis-match",它仅在源位置而不是目标位置,它们会沿qwertyuiop.avi的行记录内容。

有没有一种方法可以直接与"File missing from destination"的输出进行比较?我似乎找不到找到在相同输出的行之间进行比较的好方法。数据是否需要导出到两个不同的CSV文件中,一个用于一侧,另一个用于另一侧,然后进行比较?


编辑

在Robert的帮助下,我正在使用以下代码对原始Compare-Object语句的输出进行分组,并根据Compare-Object的计数为同名文件输出一条消息声明。

Group-Object

1 个答案:

答案 0 :(得分:2)

您可以将输出放入变量中。

$compare = compare-object ....

然后您可以根据名称在该循环上运行并搜索重复项

Foreach ($file in $compare.name) {
    If (($compare.name -match $file).count -ge 2) {
        "Perform action based on file"
    }
}

我希望这会有所帮助。

if语句的另一个选项是

(($compare | where name -eq $file).count -ge 2)

如果要将计数搜索设置为-eq 1,则可以使用该记录进行不同的记录。

另一种选择是将比较对象通过管道传递到组对象,并为一条消息扩展2,为另一条消息扩展1。让我知道您是否要这样做。组对象的优点是不会两次给您相同的消息。 事实证明,我正在构建的脚本需要类似的东西。 (当然可以简化为您的需求)

$csv1 = Import-CSV "X:\Documents\Customer Projects\Destination.csv"
$csv2 = Import-CSV "X:\Documents\Customer Projects\Source.csv"
$compare = Compare-Object -ReferenceObject $csv2 -DifferenceObject $csv1 -Property Name,Size,Hash
#this next line finds duplicate errors
$findings = group-object $compare -property name | where count -ge 2
foreach  ($finding in $findings) {
    $expand = $finding | select -ExpandProperty group | select -expand name -first 1
    $compare | where name -match $expand | Add-Member -MemberType NoteProperty -Name Notes -Value "Hashes don't match" -force
}
$compare | where Notes -match ".." | select Name,Size,Hash,Notes  | export c:\compare.csv