这两个文件明显不同。但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中二进制文件比较的速度中所有这些方法的比较