none
Странное поведение count в AD RRS feed

  • Вопрос

  • Доброго времени суток!

    Суть - получить список пользователей по определенным критериям, для простоты сократим до минимума:

    $usr = ADUser -Filter *
    $usr.count
    2433


    все правильно, но когда пользователь всего один, начинаются странности:

    $usr = Get-ADUser admin
    $usr.count

    count ничего не выдает:

    PS C:\> $usr -eq $null
    False
    PS C:\> $usr.count -eq $null
    PS C:\> $usr.count -ne $null
    PS C:\> $usr.count | gm
    gm : Укажите объект для командлета Get-Member.
    строка:1 знак:14
    + $usr.count | gm
    +              ~~
        + CategoryInfo          : CloseError: (:) [Get-Member], InvalidOperationException
        + FullyQualifiedErrorId : NoObjectInGetMember,Microsoft.PowerShell.Commands.GetMemberCommand
    
    PS C:\>
    
    Я даже не могу в скрипте отловить это состояние, когда пользователь один. Подскажите, как можно решить этот вопрос.

    2 сентября 2019 г. 14:32

Ответы

  • дело в том, что командлет может возвращать результаты разных типов: если значение на выходе не единственное, то на выходе будет массив, если единственное - то тип возвращаемого значения будет равен типу элемента массива из предыдущего случая.

    Т.к. вы заранее можете не знать, что будет возвращено командлетом (единственное значение или массив), то вы можете подстраховаться и принудительно привести результат к типу массив, тогда вы всегда можете оперировать с результатом, как с массивом.

    Для принудительного приведения к типу массив можно использовать следующую конструкцию: @()

    Тогда ваш код может выглядеть так:

    $usr = @(ADUser -Filter *)
    $usr.count
    2433

    $usr = @(Get-ADUser admin) $usr.count

    1


    my blog: http://shserg.ru/

    • Предложено в качестве ответа Vector BCOModerator 19 ноября 2019 г. 14:32
    • Помечено в качестве ответа Vector BCOModerator 19 ноября 2019 г. 14:32
    22 октября 2019 г. 8:06
  • count это свойство массива. массив состоит из минимум 2х обьектов.

    если вам нужно что либо посчитать то у вас есть замечательный коммандлет для этого - Measure-Object

    Ваш пример должен выглядеть приблизительно так

    (Get-AdUser Admin | Measure-Object).Count
    в таком случа вы получите правильно значение в любом из возможных вариантов: 0, 1, >1


    The opinion expressed by me is not an official position of Microsoft

    • Помечено в качестве ответа Rinat Moustafin 2 сентября 2019 г. 15:47
    2 сентября 2019 г. 14:37
    Модератор

Все ответы

  • count это свойство массива. массив состоит из минимум 2х обьектов.

    если вам нужно что либо посчитать то у вас есть замечательный коммандлет для этого - Measure-Object

    Ваш пример должен выглядеть приблизительно так

    (Get-AdUser Admin | Measure-Object).Count
    в таком случа вы получите правильно значение в любом из возможных вариантов: 0, 1, >1


    The opinion expressed by me is not an official position of Microsoft

    • Помечено в качестве ответа Rinat Moustafin 2 сентября 2019 г. 15:47
    2 сентября 2019 г. 14:37
    Модератор
  • PS C:\> $usr = Get-ADUser -Filter 'Name -eq "noname"'
    PS C:\> $usr.count
    0
    PS C:\>

    Странная логика в powershell :) но спасибо за помощь!

    2 сентября 2019 г. 15:55
  • дело в том, что командлет может возвращать результаты разных типов: если значение на выходе не единственное, то на выходе будет массив, если единственное - то тип возвращаемого значения будет равен типу элемента массива из предыдущего случая.

    Т.к. вы заранее можете не знать, что будет возвращено командлетом (единственное значение или массив), то вы можете подстраховаться и принудительно привести результат к типу массив, тогда вы всегда можете оперировать с результатом, как с массивом.

    Для принудительного приведения к типу массив можно использовать следующую конструкцию: @()

    Тогда ваш код может выглядеть так:

    $usr = @(ADUser -Filter *)
    $usr.count
    2433

    $usr = @(Get-ADUser admin) $usr.count

    1


    my blog: http://shserg.ru/

    • Предложено в качестве ответа Vector BCOModerator 19 ноября 2019 г. 14:32
    • Помечено в качестве ответа Vector BCOModerator 19 ноября 2019 г. 14:32
    22 октября 2019 г. 8:06
  • Это какая-то проблема с модулем AD.

    Если вы выполните 

    $usr = Get-ADUser admin
    $usr.count
    
    # А потом
    
    $usr

    то увидите странное


    Сазонов Илья

    https://isazonov.wordpress.com/

    19 ноября 2019 г. 13:58
    Модератор
  • массив состоит из минимум 2х обьектов.

    стыдно батенька.

     $a=@()
     $a.gettype()

    $a.Count

    ---

    а чо казун не появлялся? он бы наругал! ShS зато появился... прикольно :-)

    но таки декларировать переменные в порношелле, я обычно допускаю только в период, когда коту делать нечего - кроме как код вылизывать :-)

    19 ноября 2019 г. 18:00
  • Svolotch, цытата справедлива для переменных явно не обьявленных. 

    s.h.s. этот вопрос прояснил

    Казун вроде бы в англоязычные ветки перебрался. Частенько его участие не помешало бы, но каждый сам выбирает где отдыхать от работы


    The opinion expressed by me is not an official position of Microsoft

    19 ноября 2019 г. 18:12
    Модератор