PowerShell比较对象可以进行二进制比较吗



这两个文件明显不同。但Compare-Object没有发现差异。第一个文件具有Unicode BOM表。有什么方法可以让Compare-Object识别它们的不同吗?

PS C:Temp> dir file*
Directory: C:Temp
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          2021-06-01    14:38         163673 file1.txt
-a---          2021-03-18    17:08         163670 file2.txt
PS C:Temp> Compare-Object -ReferenceObject (Get-Content -Path .file2.txt) -DifferenceObject (Get-Content -Path .file2.txt)
PS C:Temp> Format-Hex -Path .file1.txt | Select-Object -First 1
Label: C:Tempfile1.txt
Offset Bytes                                           Ascii
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
------ ----------------------------------------------- -----
0000000000000000 ***EF BB BF*** 3C 3F 78 6D 6C 20 76 65 72 73 69 6F 6E <?xml version
PS C:Temp> Format-Hex -Path .file2.txt | Select-Object -First 1
Label: C:Tempfile2.txt
Offset Bytes                                           Ascii
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
------ ----------------------------------------------- -----
0000000000000000 3C 3F 78 6D 6C 20 76 65 72 73 69 6F 6E 3D 22 31 <?xml version="1
PS C:Temp> $PSVersionTable.PSVersion.ToString()
7.1.3

两个文件不同,但Get-Content生成的字符串相同。

使用-Encoding参数使Get-Content读取原始字节值:

Compare-Object (Get-Content .file2.txt -Encoding Byte) (Get-Content .file1.txt -Encoding Byte)

您可能会发现Get-FileHash在检测两个(或多个(文件的字节级相等性方面更有效:

PS ~> Get-FileHash *.txt

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          F1945CD6C19E56B3C1C78943EF5EC18116907A4CA1EFC40A57D48AB1DB7ADFC5       C:pathtofile1.txt
SHA256          E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855       C:pathtofile2.txt

使用Get-Content -AsByteStream将表示差异。

PS C:Temp> Compare-Object -ReferenceObject (Get-Content -Path .file1.txt -AsByteStream) `
-DifferenceObject (Get-Content -Path .file2.txt -AsByteStream)
InputObject SideIndicator
----------- -------------
239 <=
187 <=
191 <=
PS C:Temp> $null -eq (Compare-Object -ReferenceObject (Get-Content -Path .file1.txt -AsByteStream) `
-DifferenceObject (Get-Content -Path .file1.txt -AsByteStream))
True
PS C:Temp> $null -eq (Compare-Object -ReferenceObject (Get-Content -Path .file1.txt -AsByteStream) `
-DifferenceObject (Get-Content -Path .file2.txt -AsByteStream))
False

快速回答:是的,Compare-Object可以进行二进制比较。

但是:速度慢得令人绝望,而且会在大文件上崩溃。

最好使用Kees Bakker编写的缓冲方法。或者,如果您更喜欢本机函数FC,它速度较慢,但对于小型工作来说速度不会太慢。

请参阅PowerShell中二进制文件比较的速度中所有这些方法的比较

最新更新