При использовании операторов включения в PowerShell (например, -contains, -notcontains, -in) для коллекции объектов (в данном случае созданных с помощью командлетов модуля ActiveDirectory) я не наблюдаю ожидаемых результатов. Кажется, что операторы не могут обнаружить объект в коллекции, который, я уверен, совпадает.
В приведенном ниже примере я даже использую командлет сравнения объектов, чтобы продемонстрировать, что элемент действительно совпадает.
$PSVersionTable | Format-Table
$adusers_list = (get-aduser -id fooboss -properties directreports).directreports |%{ Get-ADUser -Identity $PSItem }
$target_aduser = get-aduser -id jrw
# This use of containing operators seems very similar to the example presented in documentation:
# https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_comparison_operators?view=powershell-6#containment-operators
# Here comes the unexpected results:
$adusers_list -contains $target_aduser
$target_aduser -in $adusers_list
#And yet...
$adusers_list |%{
if ($_.samaccountname -eq "jrw") {
write-output "Contrary to what the contains operators told us, here it is: $($_.samaccountname)"
Write-output "also, compare-object says:"
compare-object $_ $target_aduser
}
}
и вывод:
Name Value
---- -----
PSVersion 5.1.18362.145
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.18362.145
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
False
False
Contrary to what the contains operators told us, here it is: jrw
also, compare-object says:
PS C:\WINDOWS\system32>
Я понимаю, что могу просто oop просмотреть и вручную сравнить набор атрибутов, и я сделаю это, если не смогу узнать, как правильно использовать операторы сдерживания, но сначала я пытаюсь это сделать.
В документации оператора, по-видимому, не упоминаются элементы типа объекта специально. В нем используется термин «ссылочное значение», поэтому, возможно, это подразумевает, что это должен быть простой тип данных? Но если это так, разве в документации не должно быть упоминания об этом, и, возможно, также PS создаст какое-то мягкое исключение для несопоставимых типов?