比较两个 .xlsx 文件内容的代码

问题描述 投票:0回答:1

我有下面的代码来比较 zip 文件夹内的文件。该代码适用于 .csv、.xml。我的 .xlsx 有问题。 zip 文件夹包含系统生成的 .xlsx 文件。肉眼看来,Excel 的内容看起来相同,但 Get-Content 和 Compare-Object 将它们识别为不同的。当我复制相同的文件并进行比较时,代码工作正常。任何帮助表示赞赏。谢谢

[string]$EventID1 = Read-Host -Prompt "Input ID-1"
[string]$EventID2 = Read-Host -Prompt "Input ID-2"
 
# Function to compare the contents of files inside zip folders
function Compare-ZipContents {
    param (
        [string]$zipFile1,
        [string]$zipFile2
    )
    $zip1 = [System.IO.Compression.ZipFile]::OpenRead($zipFile1)
    $zip2 = [System.IO.Compression.ZipFile]::OpenRead($zipFile2)

    $xmlFilePath1 = $zip1.Entries | Where-Object { $_.Name -like "*.xml" }
    $xmlFilePath2 = $zip2.Entries | Where-Object { $_.Name -like "*.xml" }

    $csvFiles1 = $zip1.Entries | Where-Object { $_.Name -like "*.csv" }
    $csvFiles2 = $zip2.Entries | Where-Object { $_.Name -like "*.csv" }
 
    $excelFiles1 = $zip1.Entries | Where-Object { $_.Name -like "*.xlsx" -or $_.Name -like "*.xls" }
    $excelFiles2 = $zip2.Entries | Where-Object { $_.Name -like "*.xlsx" -or $_.Name -like "*.xls" }
 
    foreach ($xml1 in $xmlFilePath1) {
        foreach ($xml2 in $xmlFilePath2) {
            $stream1 = $xml1.Open()
            $stream2 = $xml2.Open()
            $reader1 = New-Object System.IO.StreamReader($stream1)
            $reader2 = New-Object System.IO.StreamReader($stream2)
            $content1 = $reader1.ReadToEnd()
            $content2 = $reader2.ReadToEnd()
            if ($content1 -eq $content2) {
                Write-Output "$($xml1.Name) and $($xml2.Name) are identical."
            }
            Else { Write-Output "$($xml1.Name) and $($xml2.Name) are different."}
            $reader1.Close()
            $reader2.Close()
            $stream1.Close()
            $stream2.Close()
        }
    }
    
    foreach ($csv1 in $csvFiles1) {
        foreach ($csv2 in $csvFiles2) {
            $stream1 = $csv1.Open()
            $stream2 = $csv2.Open()
            $reader1 = New-Object System.IO.StreamReader($stream1)
            $reader2 = New-Object System.IO.StreamReader($stream2)
            $content1 = $reader1.ReadToEnd()
            $content2 = $reader2.ReadToEnd()
            if ($content1 -eq $content2) {
                Write-Output "$($csv1.Name) and $($csv2.Name) are identical."
            }
            Else { Write-Output "$($csv1.Name) and $($csv2.Name) are different."}
            $reader1.Close()
            $reader2.Close()
            $stream1.Close()
            $stream2.Close()
        }
    }
 
    foreach ($excel1 in $excelFiles1) {
        foreach ($excel2 in $excelFiles2) {
            $stream1 = $excel1.Open()
            $stream2 = $excel2.Open()
            $reader1 = New-Object System.IO.StreamReader($stream1)
            $reader2 = New-Object System.IO.StreamReader($stream2)
            $content1 = $reader1.ReadToEnd()
            $content2 = $reader2.ReadToEnd()
            if ($content1 -eq $content2) {
                Write-Output "$($excel1.Name) and $($excel2.Name) are identical."
            }
            Else {Write-Output "$($excel1.Name) and $($excel2.Name) are different."}
            $reader1.Close()
            $reader2.Close()
            $stream1.Close()
            $stream2.Close()

        }
    }
 
    $zip1.Dispose()
    $zip2.Dispose()
}
 
# Path
$zipFile1 = "Address 1"
$zipFile2 = "Address 2"
Compare-ZipContents -zipFile1 $zipFile1 -zipFile2 $zipFile2
powershell
1个回答
0
投票

此代码使用了您在问题中发布的大部分内容。它将比较两个存档中文件的存档文件的

Crc32
值。它需要测试并添加基于评论的帮助。

# Function to compare the contents of files inside zip folders
function Compare-Archive {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)]
        [string] $Archive1
        ,
        [Parameter(Mandatory=$true)]
        [string] $Archive2
        ,
        [Parameter(Mandatory=$false)]
        [string[]] $Extension
    )
    $re = '^.*(' + ($Extension -join '|') + ')$'

    $Zip1 = [System.IO.Compression.ZipFile]::OpenRead((Convert-Path -Path $Archive1))
    $Zip2 = [System.IO.Compression.ZipFile]::OpenRead((Convert-Path -Path $Archive2))

    $FilePath1 = $zip1.Entries | Where-Object { $_.Name -match $re }
    $FilePath2 = $zip2.Entries | Where-Object { $_.Name -match $re }

    $AllFiles = $FilePath1.fullname + $FilePath2.FullName | Sort-Object -Unique

    foreach ($File in $AllFiles) {
        if ($File -notin $FilePath1.FullName) {
            Write-Warning "File $($File) is not in Archive1"
        }
        if ($File -notin $FilePath2.FullName) {
            Write-Warning "File $($File) is not in Archive2"
        }
    }

    $FilesToCompare = ($FilePath1.FullName + $FilePath2.FullName | Group-Object -NoElement | Where-Object Count -gt 1).Name

    foreach ($File in $FilesToCompare) {
        $File1 = $FilePath1 | Where-Object { $_.FullName -ceq $File }
        $File2 = $FilePath2 | Where-Object { $_.FullName -ceq $File }

        if ($File1.Crc32 -ne $File2.Crc32) {
            Write-Output [pscustomobject]@{
                FileName = $File
                File1Crc32 = $File1.Crc32
                File2Crc32 = $File1.Crc32
            }
        }
    }

    $zip1.Dispose()
    $zip2.Dispose()
}

# Compare-Archive -Archive1 'f1.zip' -Archive2 'f1notin2.zip'

sdf

© www.soinside.com 2019 - 2024. All rights reserved.