【问题标题】:powershell get-contain is showing difference form Out-String when comparing Compare-Object比较比较对象时,powershell get-contain 显示与 Out-String 的差异
【发布时间】:2020-12-16 14:51:46
【问题描述】:

我正在运行一个小脚本来比较一个文件中存在的内容与一个返回数组的命令的响应

$data = @('Zero','One','Two','Three')
$file = "C:\test.txt"

# Save the array to file 
Set-Content $file  (Out-String -InputObject $data)

#compair file to array 
$IsIdentical = Compare-Object -ReferenceObject (get-content -Path $file) -DifferenceObject (Out-String -InputObject $data)
if($IsIdentical -eq $null)
{
    Write-Output "Identical"
}
else
{
    Write-Output "Not Identical"
}

我的输出为Not Identical

谁能解释一下为什么不一样!!!另外,我该如何解决这个问题?

【问题讨论】:

  • 使用-Stream 开关Out-String 防止输出末尾出现多余的空行。
  • 您可能希望将参数-syncWindow 0 添加到Compare-Object 调用。见PowerShell order sensitive Compare-Objects diff
  • @zett42 感谢我尝试过的回复,仍然收到Not Identical
  • 我的评论不能解决您的问题,但它显示了如何解决另一个问题。 Compare-Object 默认以任意顺序匹配项目。所以@('Zero','One','Two','Three') 将与@('One','Zero','Two','Three') 比较为“相等”。通过添加-syncWindow 0,只有在 order 也相等时,数组才会比较相等。
  • @zett42 compare-object 与默认同步窗口对于大文件也可能非常慢。

标签: powershell string-comparison


【解决方案1】:

Out-String 没有-Stream 一次处理整个输入对象。一旦该对象输入转换为字符串,就会在末尾添加一个换行符组合。使用-Stream时,输入的每一行都作为字符串处理,不追加最后的换行符。

由于Out-String -InputObject $data 在输出末尾产生额外的换行符而$data 没有它们,所以比较结果是预期的。您可以利用Set-ContentOut-String 上的开关来处理此行为。

# Option 1 Using -Stream Switch with Out-String
Set-Content $file (Out-String -InputObject $data -Stream)

# Option 2 Using -NoNewLine with Set-Content
Set-Content $file (Out-String -InputObject $data) -NoNewLine

$IsIdentical = Compare-Object -ReferenceObject (Get-Content -Path $file) -DifferenceObject $data
$null -eq $IsIdentical
True

【讨论】:

  • 感谢您的解释,但在进行更改后仍然得到响应Not Identical 我尝试了选项一和二!两者都以相同的响应返回 $IsIdentical
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多