Сравнить в одном и том же наборе результатов Compare-Object - PullRequest
0 голосов
/ 23 октября 2018

У меня есть файл CSV, который содержит имя, размер и хэш (имя файла, размер в байтах и ​​хэш-код MD5) для каждого файла на одном из моих устройств хранения.Как только эти данные будут перемещены, я сгенерирую хеш для каждого файла, включая также имя и размер, а затем сравню эти столбцы со столбцами в существующем CSV.Я знаю, что есть утилиты, которые делали бы всю эту работу за меня, но я делаю это больше как опыт обучения, чем что-либо еще.

Что я хотел бы сделать, это для имен файлов, размерови хэши, которые не совпадают идеально, я хотел бы экспортировать журнал, указывающий, не существует ли файл в новом месте, или если есть несоответствие хэша.

Например, используя мой текущий скрипт сравнения:

$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".

Есть ли способ сделать это сравнение непосредственно с выводом Compare-Object?Я не могу найти хороший способ сравнить строки одного и того же вывода.Нужно ли экспортировать данные в два разных файла CSV, один для одной стороны, а другой для другой, а затем сравнить?


РЕДАКТИРОВАТЬ :

С помощью Роберта я использую приведенный ниже код, чтобы сгруппировать выходные данные моего исходного оператора Compare-Object и вывести одно сообщение для файлов с тем же именем на основе счетчика оператора Group-Object.

$csv1 = Import-CSV "X:\Documents\Customer Projects\Destination.csv"
$csv2 = Import-CSV "X:\Documents\Customer Projects\Source.csv"
$test = Compare-Object -ReferenceObject $csv2 -DifferenceObject $csv1 -Property Name,Size,Hash
$group = $test | Group-Object -Property Name
foreach ($file in $group)
{
    if (($file | Select-Object -ExpandProperty Count) -ge 2) {
        Write-Host ""$file.name"- Hash mis-match"
    }
    if (($file | Select-Object -ExpandProperty Count) -eq 1) {
        Write-Host ""$file.name"- File missing"
    }
}

1 Ответ

0 голосов
/ 23 октября 2018

Вы можете поместить свой вывод в переменную.

$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 для другого.Дайте мне знать, если это то, что вы хотели бы сделать.Преимущество group-object в том, что оно не даст вам одно и то же сообщение дважды.Оказывается, сценарий, который я создаю, нуждался в чем-то похожем ... Вот как я это сделал.(упрощенно, конечно, для ваших нужд)

$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
...