如何解决带文本文件的比较对象API响应显示一切都不同
我有一个Web API,该API返回一个HTML字符串,该字符串要与本地计算机上的html文件进行比较。
为此,我有以下代码
$Result = (Invoke-WebRequest `
-Uri "{uri}" `
-Headers @{"some-header","some-value"}).Content
$TestContent = Get-Content -Path ($RepositoryLocation + "index.html") -Raw
$Equal = Compare-Object -ReferenceObject $TestContent -DifferenceObject $Result
当我现在使用Write-Hosts $Equal
时,它告诉我整个内容是不同的
当我使用Write-Host $Equal.SideIndicator
时,它会显示=> <=
,这也表明整个文件是不同的
此外,将命令与-IncludeEqual -ExcludeDifferent
一起使用会显示空结果,因此就像我说的那样,没有行是相同的。
因此,我接下来尝试的是将$Result
的内容保存到文本文件中,然后进行比较,但仍然告诉我,整个文件是不同的。
然后,我使用diffchecker.com以及JetBrains IDEs集成的比较工具来检查差异。两种工具都告诉我内容是相同的。我不介意,为什么PowerShell告诉我它们具有完全不同的内容?
遗憾的是,我无法发布API响应的内容以及index.html的内容
我认为可能是原因
- 编码,但是两者都是UTF8
- 行尾,但是如果我在文件上使用CL,CL RF或RF,则没有区别
- 一些隐藏的字符(用制表符代替空格),但我激活后在JetBrains IDE上看到了这些字符,但它们仍然相同。
我怎么知道是什么原因导致了此问题?
解决方法
不确定Compare-Object
是这里的正确选择。顾名思义,它用于对象。为什么不使用equals-operator -eq
或string.Equals
?
$equal = $testContent -eq $result
# or
$equal = $testContent.Equals($result)
如果 Compare-Object
都只是单个字符串,则不会进行逐行比较。因此,只要有细微的差别,字符串之间就不会相等,甚至在结尾处只需要换行,等等。
您可以尝试以下几种方法:
# trim
$equal = $testContent.Trim() -eq $result.Trim()
# case-insensitive comparison
$equal = $testContent.Equals($result,'OrdinalIgnoreCase')
# or both
$equal = $testContent.Trim().Equals($result.Trim(),'OrdinalIgnoreCase')
顺便说一句:如果您要进行逐行比较,则必须先将字符串分成几行,例如:
Compare-Object ($testContent -split "`r`n") ($result -split "`r`n")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。