Powershell foreach (перечислить ссылку на команду элемента массива) - PullRequest
0 голосов
/ 28 августа 2018

Я ищу высоко и низко без удачи.
Используя foreach для массива, после выполнения команды для каждого из элементов массива я не уверен, из какого элемента массива получены результаты.

Я пробовал много вариантов. Этот код - лучший пример того, что я пытался сделать.

$ADGroupVar = @(
'ADGroup1'
'ADGroup2'
'ADGroup3'
);

foreach ($ADgrouplist in $ADGroupVar)
{
Write-Host $ADgrouplist
Get-ADGroupMember ($ADgrouplist) | select name
}

ADGroup1
ADGroup2
ADGroup3

Computer5
Computer10
Computer2
Computer4
Computer20
Computer3
Computer1

Желаемые результаты:

ADGroup1
Компьютер5
Компьютер10
ADGroup2
Компьютер2
Компьютер4
Компьютер20
ADGroup3
Компьютер3
Компьютер1

или

Computer5 ADGroup1
Computer10 ADGroup1
...

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Для достижения других «желаемых результатов»

Computer5 ADGroup1

Computer10 ADGroup1

Вы можете использовать:

'ADGroup1', 'ADGroup2', 'ADGroup3' | ForEach-Object {
    $GroupName = $_
    Get-ADGroupMember $_ | ForEach-Object {
        "$($_.Name) $GroupName"
    }
}

или

$adGroupList = 'ADGroup1', 'ADGroup2', 'ADGroup3'
$adGroupList | ForEach-Object {
    $GroupName = $_
    Get-ADGroupMember $_ | ForEach-Object {
        "$($_.Name) $GroupName"
    }
}

или

$adGroupList = 'ADGroup1', 'ADGroup2', 'ADGroup3'
foreach ($adGroup in $adGroupList) {
    Get-ADGroupMember $adGroup | ForEach-Object {
        "$($_.Name) $adGroup"
    }
}

или

$adGroupList = 'ADGroup1', 'ADGroup2', 'ADGroup3'
foreach ($adGroup in $adGroupList) {
    $adGroupMembers = (Get-ADGroupMember $adGroup).Name
    foreach ($adGroupMember in $adGroupMembers) {
        "$adGroupMember $adGroup"
    }
}
0 голосов
/ 28 августа 2018

Вы действительно не хотите, что вы просите. Серия строк, некоторые имена групп и некоторые имена членов, где имена, следующие за именем группы, являются членами, является очень хрупкой системой.

Как вы можете отличить имена групп от имен участников? Если вы измените порядок, скажем, сортировки, членство в группе будет потеряно. Работать с данными таким образом позже будет сложно.

Вы можете использовать hashtable вместо:

$ADGroupVar = @(
    'ADGroup1'
    'ADGroup2'
    'ADGroup3'
);

$results = @{}
foreach ($ADgroup in $ADGroupVar)
{
    $results[$ADgroup] = Get-ADGroupMember $ADgroup | select name
}

Write-Output $results

Это связывает каждое имя группы со списком имен пользователей. Доступ к ним осуществляется с помощью оператора индекса [], например:

$results['ADGroup2']

computer2
computer4
computer20

и все содержимое хеш-таблицы отображается следующим образом:

$results

Name                           Value                                           
----                           -----                                           
ADGroup2                       {computer2, computer4, computer20}              
ADGroup3                       {computer3, computer1}                          
ADGroup1                       {computer5, computer10}                         
0 голосов
/ 28 августа 2018

Прекратить использование Write-Host. Вы не можете полагаться на его вывод, особенно при смешивании с stdout. Этот пример должен иллюстрировать то, что вы пытаетесь выполнить:

$adGroupList = 'ADGroup1', 'ADGroup2', 'ADGroup3'

foreach ($group in $adGroupList)
{
    $group
    (Get-ADGroupMember $group).Name
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...