Эта публикация больше не отвечает на вопрос ОП напрямую, но содержит справочную информацию, которая полезна для подобных ситуаций. Эта конкретная проблема решается путем обработки символов CR и LF перед сравнением данных. Подробнее см. Отмеченный ответ .
Поскольку $data
в данном случае является объектом со свойством value
, в котором хранятся ваши данные, вам необходимо сравнить то, что хранится в свойстве value
, с вашим $regval
:
Compare-Object $data.value $regval
$regval
- это массив строк до того, как вы передадите его в Out-String
. После канала он становится a строковым объектом . Ниже приведена информация о типе перед подачей на Out-String
.
$regval.gettype().fullname
System.String[]
$data
- это массив объектов (PSCustomObjects), у каждого из которых есть свойство с именем Value
, на которое необходимо напрямую ссылаться, если вы хотите получить его данные:
$data.gettype().fullname
System.Object[]
$data | Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Value NoteProperty string Value=System\CurrentControlSet\Control\ProductOptions
($regval | Get-member).where({$_.MemberType -eq "Property"})
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
Length Property int Length {get;}
Для сравнения данных двух объектов с использованием Compare-Object
наилучшие результаты, по-видимому, достигаются, когда объекты представляют собой коллекции одного типа. PowerShell автоматически выполняет преобразования в фоновом режиме в некоторых случаях, например Compare-Object "1" 1
. Может быть, это как-то связано с типами значений, так как я не совсем уверен. Я бы сделал сравнение перед преобразованием любых ваших данных в различные типы. Затем, если вы ссылаетесь на свойство Value
$data
, это условие становится истинным:
$data.value | Get-member -type Property
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
Length Property int Length {get;}
Вы можете сослаться на объяснение MKlement0 для получения дополнительной информации о том, как PowerShell обрабатывает тип массива.