Как получить доступ к дополнительным свойствам объекта в Pipeline после прохождения через одну коллекцию свойств объектов - PullRequest
0 голосов
/ 13 сентября 2018

Предположим, я обрабатываю список пользовательских объектов в функции.

Function DoThings {
   Process { $_.memberof).where{ $_ -match "Team_" }.foreach{ Remove-ADGroupMember $_ $_.samaccountname}
                  }#did things

Проблема в том, что поскольку цикл foreach используется для вывода where, я ограничился тем, что не смог получить доступ к остальным свойствам объектов.

Я хочу пройтись по подмножеству свойств объектов, но мне также нужно иметь возможность получить доступ к другой информации из свойств пользователя для передачи в командлет (например, к имени пользователя).

Пока единственное, что мне удалось выяснить, это присвоить $ _. Samaccountname временной переменной, а затем вызвать ее позже, но это не элегантно.

Есть ли более чистый способ сделать это?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Используя методы where () и foreach (), вы можете указать параметр.

Function DoThings {

    Param ($user)

    Process {

    $_.memberof.Where{
    $_ -match "Team_" }.foreach{
    Remove-ADGroupMember $_ $user.samaccountname}

            }

}#did things

Указав свой ввод в качестве параметра, вы можете получить доступ к исходному объекту с именем параметра.

DoThings $Userlist

В качестве альтернативы, чтобы поддерживать доступность конвейера, вы можете превратить функцию в расширенную функцию, чтобы позволить параметру явно принимать входные данные конвейера.

Function DoThings {

    [cmdletbinding()]
    param([Parameter(ValueFromPipeline = $true)]$user)

    Process {

    $_.memberof.where{ 
    $_ -match "Team_" }.foreach{ 
    Remove-ADGroupMember $_ $user.samaccountname}

            }

}#did things

Будет работать как

$Userlist DoThings 

Базовая функция будет принимать входные данные конвейера, но доступна только через автоматическую переменную $ _.В моем тестировании с использованием автоматической переменной $ input есть доступ к начальным свойствам объекта, но, по-видимому, ее можно использовать только один раз для каждой функции.

Вместо присвоения значения временной переменной гораздо элегантнее использовать функциирасширенная функция.

Тот же метод можно использовать с командлетами ForEach-Object и Where-Object без создания новой переменной.

0 голосов
/ 13 сентября 2018

Это можно считать более элегантным:

Function DoThings {
    Process {
        ($_.memberof) | 
            Where-Object { $_ -match "Team_" } -PipelineVariable pipevar | 
                ForEach-Object { Remove-ADGroupMember $_ $pipevar.samaccountname}
}#did things

больше о PipelineVariable

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