我有下面的代码来比较 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
此代码使用了您在问题中发布的大部分内容。它将比较两个存档中文件的存档文件的
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