首页 > 解决方案 > PowerShell Compare-Object 可以进行二进制比较吗?

问题描述

这两个文件明显不同。但是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:\Temp\file1.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:\Temp\file2.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

标签: powershell

解决方案


这两个文件不同,但产生的字符串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:\path\to\file1.txt
SHA256          E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855       C:\path\to\file2.txt

推荐阅读