PowerShell - Сравните 2 объекта на основе и найдите несоответствия - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть ниже 2 объектов, которые дают мне содержимое папки. (Не в локальной windows файловой системе, но в Azure озере данных)

$Gen1Files= $Folder1Details | select FilePath, FileLength

$Gen2Files= $Folder2Details | Select FilePath, FileLength

Папка 1 является источником, а папка 2 является целевой. После копирования данных в целевой объект, я хочу сравнить оба объекта на основе FilePath, и мне нужен хороший результат, экспортированный в CSV, который дает мне такие результаты, как доступный файл, отсутствует файл, совпадает FileLength, отсутствует FileLength et c ..

Я видел команду Compare-Object, но не уверен, смогу ли я использовать ее для этого сценария. пожалуйста, помогите.

Редактировать:

Я написал код ниже, и он работает правильно. Но я чувствую, что код очень длинный и его можно переписать. Какие-нибудь мысли?

    ForEach ($Gen1File in $Gen1Files) {

        $Gen2Match = $Gen2Files | Where-Object { $_.Path -eq $Gen1File.Path } 
        If ($Gen2Match) {
            # Process the data
            if ($Gen1File.Length -eq $Gen2Match.Length) {
                $MatchResult += New-Object PsObject -Property @{Gen1FilePath = $Gen1File.Path; Gen2FilePath = $Gen2Match.Path; Gen1FileSize = $Gen1File.Length;
                    Gen2FileSize = $Gen2Match.Length; IsMatching = "Yes"
                }
            }

            else
            {
                $MatchResult += New-Object PsObject -Property @{Gen1FilePath = $Gen1File.Path; Gen2FilePath = $Gen2Match.Path; Gen1FileSize = $Gen1File.Length;
                    Gen2FileSize = $Gen2Match.Length; IsMatching = "No"
                }
            }

        }
        else {
            $MatchResult += New-Object PsObject -Property @{Gen1FilePath = $Gen1File.Path; Gen2FilePath = ""; Gen1FileSize = $Gen1File.Length;
                Gen2FileSize = ""; IsMatching = "No"
            }
        }
    }

# Check if Gen2 files are available in Gen1 Account 

    ForEach ($Gen2File in $Gen2Files) {

        $Gen1Match = $Gen1Files | Where-Object { $_.Path -eq $Gen2File.Path } 

        If ($Gen1Match) {
            # Process the data
            if ($Gen2File.Length -eq $Gen1Match.Length) {
                $MatchResult += New-Object PsObject -Property @{Gen1FilePath = $Gen1Match.Path; Gen2FilePath = $Gen2File.Path; Gen1FileSize = $Gen1Match.Length;
                    Gen2FileSize = $Gen2File.Length; IsMatching = "Yes"
                }
            }

            else
            {
                $MatchResult += New-Object PsObject -Property @{Gen1FilePath = $Gen1Match.Path; Gen2FilePath = $Gen2File.Path; Gen1FileSize = $Gen1Match.Length;
                    Gen2FileSize = $Gen2File.Length; IsMatching = "No"
                }
            }

        }
        else {
            $MatchResult += New-Object PsObject -Property @{Gen1FilePath = ""; Gen2FilePath = $Gen2File.Path; Gen1FileSize = "";
                Gen2FileSize = $Gen2File.Length; IsMatching = "No"
            }
        }
    }

1 Ответ

0 голосов
/ 26 апреля 2020

Вот начало, или это, по крайней мере, помогло бы другим людям понять вопрос. -пастру просто передал бы оригинальные объекты. Я уверен, что есть другие сообщения о сравнении файлов в двух папках. Существует много путаницы вокруг объекта сравнения. Если вы не сравниваете строки, вам, вероятно, нужно указать свойства для сравнения.

echo hi > gen1/same   
echo hi > gen2/same
echo hi > gen1/gen1only
echo hi > gen2/gen2only
echo hi > gen1/different
echo hihi > gen2/different

$a = dir gen1
$b = dir gen2

compare-object $a $b -property name,length -IncludeEqual # -passthru

name      length SideIndicator
----      ------ -------------
same           3 ==
different      5 =>
gen2only       3 =>
different      3 <=
gen1only       3 <=
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...