Powershell Compare-Object не сравнивает содержимое массивов - PullRequest
0 голосов
/ 11 июля 2019

У меня есть 2 массива, и я хотел бы сравнить его на powershell. Для этого я использую Compare-Object, но иногда процесс сравнения некорректен.

если в одном массиве есть запись, которой нет в другом, то распознаются различия

■ActualResult

  date                  data

---------              ------

2019/7/11                 1


■ExpectedResult

  date                  data

---------              ------

■diff

SideIndicator       date                  data

-------------     ---------              ------

    <=            2019/7/11                 1

но если сделать различие с одним из столбцов, это ничего не сработает

■ActualResult

  date                  data

---------              ------

2019/7/11                 1


■ExpectedResult

  date                  data

---------              ------

2019/7/11                 2

■diff

SideIndicator       date                  data

-------------     ---------              ------

это код, который я использую для этого результата

foreach($package in $targetPackage)
{
    $sheetName = $package.No

    $tempExpectedVal = Import-XLSX -Path $testData -Sheet $sheetName
    $targetPackage = $project.Packages[$package.PackageName]

    foreach($parameter in $targetParameter){
        if($parameter.PackageName -eq $targetPackage.Name){       
            if($parameter.ParamaterType -eq "Package"){
                $targetPackage.Parameters[$parameter.ParameterName].Set([Microsoft.SqlServer.Management.IntegrationServices.ParameterInfo+ParameterValueType]::Literal,$parameter.ParameterVal) 
                $Project.Alter() 
            }elseif ($parameter.ParamaterType -eq "Project") {
                $project.Parameters[$parameter.ParameterName].Set([Microsoft.SqlServer.Management.IntegrationServices.ParameterInfo+ParameterValueType]::Literal,$parameter.ParameterVal) 
                $Project.Alter() 
            }else {

            }
        }
    }

    #$startTime = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
    $startTime = "2019/07/10 11:00:00"
    $targetPackage.Execute("false", $null)
    $endTime = "2019/07/10 19:00:00"

    #create tag list object
    $tempActualVal = New-Object System.Data.DataTable


    #create new SQL Server Connection
    $sqlConnString =  "Data Source=10.118.2.5;Initial Catalog=mieruka_dev_db;uid=sqlroot;pwd=@S9L_adminS1"
    $sqlConn = New-Object System.Data.SqlClient.SqlConnection
    $sqlConn.ConnectionString = $sqlConnString
    $sqlConn.Open()

    #prepare SQL command object and SQL Adapter to execute the query
    $sqlQuery = New-Object System.Data.SqlClient.SqlCommand
    $sqlQuery.Connection = $sqlConn
    $sqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter

    #Create select Query and prepare it on SQL Adapter
    $table = $package.Schema+"."+$package.Table
    $sqlQuery.CommandText = "SELECT * FROM "+$table+" WHERE created_at BETWEEN @param2 AND @param3 OR updated_at BETWEEN @param2 AND @param3"
    $sqlQuery.Parameters.Add("param2",$startTime)
    $sqlQuery.Parameters.Add("param3",$endTime)
    #prepare insert command to sql adapter
    $sqlAdapter.SelectCommand = $sqlQuery
    #execute the query

    $res = $sqlAdapter.SelectCommand.ExecuteReader() 
    $tempActualVal.Load($res)
    $sqlConn.Close()

    $tempActualVal.Columns.Remove("created_by")
    $tempActualVal.Columns.Remove("updated_by")
    $tempActualVal.Columns.Remove("created_at")
    $tempActualVal.Columns.Remove("updated_at")

    $actualVal = [System.Collections.ArrayList]@{}
    $expectedVal = [System.Collections.ArrayList]@{}
    $report = [System.Collections.ArrayList]@{}
    $columns = $tempExpectedVal | Get-Member -MemberType NoteProperty | ForEach-Object {"$($_.Name)"}

    foreach($tarVal in $tempExpectedVal){
        $tempData1 = @{}
        foreach($col in $columns){
            $tempData1.Add($col, $tarVal.$col)
        }
        $expectedVal.Add($tempData1)
    }
    foreach($val in $tempActualVal){
        $tempData2 = @{}
        foreach($col in $columns){
            $tempData2.Add($col, $val[$col])
        }
        $actualVal.Add($tempData2)
    }

    $fileName = "diff_"+ $package.packageName + "_" + (Get-Date).ToString("yyyyMMddHHmmss")+".xlsx"
    $resDir = $parentfDir + "\testcase\"+$fileName
    $diffs = Compare-Object $actualVal $expectedVal -Property $columns -PassThru

    if($diffs){
        foreach($diff in $diffs){
            $rep = New-Object -Type PSCustomObject
            if($diff.SideIndicator -eq "=>"){
                $rep | Add-Member -type NoteProperty -Name "Type" -Value "Expected_value"
            }else{
                $rep | Add-Member -type NoteProperty -Name "Type" -Value "Actual_value"
            }

            foreach($col in $columns){
                $rep | Add-Member -type NoteProperty -Name $col -Value $diff.$col
            }
            $report.Add($rep) | Out-Null
        }

        $report | Export-XLSX -Path $resDir
    }


}

Я ожидал, что результат будет таким:

■diff

SideIndicator       date                  data

-------------     ---------              ------
     <=           2019/7/11                 1
     =>           2019/7/11                 2

есть ли в Powershell какие-либо другие функции, позволяющие получить ожидаемый результат?

...