Операторы локализации PowerShell с коллекциями объектов - PullRequest
0 голосов
/ 08 апреля 2020

При использовании операторов включения в 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 создаст какое-то мягкое исключение для несопоставимых типов?

1 Ответ

1 голос
/ 08 апреля 2020

Вы сравниваете сложный объект с простым значением. Вам необходимо сравнить эквивалентные типы объектов. В качестве примера, чтобы показать вам, измените свою логику сравнения c на:

($adusers_list | Select -Expand samaccountname) -contains $target_aduser.samaccountname

. Это фактически превращает AD User List в не более чем string[], содержащий samaccountname пользователей в вашем $adusers_list. Затем мы сравниваем эквивалентное значение ($target_user.samaccountname), чтобы увидеть, содержится ли это string -значение в сравниваемом string[].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...