Два разных вывода из psObject

У меня есть следующий код, который будет записывать всех пользователей, входящих в группу или нет:

$Host.UI.RawUI.WindowTitle = "User Group Finder"
$groupname = Read-Host -Prompt 'Enter group name: '

Write-Host ""
Write-Host "People who are not in this group:" -ForegroundColor Red

$results = @()
$users = Get-ADUser  -Properties memberof -Filter * 
foreach ($user in $users) {
    $groups = $user.memberof -join ';'
    $results += New-Object psObject -Property @{'User'=$user.name;'Groups'= $groups}
    }

$results | Where-Object { $_.groups -notmatch $groupname } | Select-Object user

Write-Host "People who are in this group:" -ForegroundColor Green

$results | Where-Object { $_.groups -match $groupname } | Select-Object user

Код работает, когда я хочу получить от него только один вывод.

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

Проблема в том, что на данный момент он объединяет выходы.

Есть ли способ сгенерировать два разных вывода из одного psObject?


person Johny Wave    schedule 21.01.2020    source источник
comment
Но у вас уже есть два разных вывода на основе -match и -notmatch из одного psObject: $results   -  person Jawad    schedule 21.01.2020
comment
@Джавад, я знаю. Но когда вы запустите скрипт, вы получите только один комбинированный вывод. Вот так: imgur.com/a/Vda0x9j   -  person Johny Wave    schedule 21.01.2020


Ответы (1)


Результаты вашей группы правильно разделены.

Проблема в том, что вы используете как консоль через Write-Host, так и конвейер (вывод обоих результатов).

Оба отображаются в консоли, но то, что проходит через конвейер, не синхронно с Write-Host

Вот почему вещи появляются не по порядку.

Отправьте выходные данные на хост для исправления, передав результаты в Out-Host, чтобы сохранить порядок при смешивании с операторами Write-Host.

$results | Where-Object { $_.groups -notmatch $groupname } | Select-Object user | Out-Host
Write-Host "People who are in this group:" -ForegroundColor Green
$results | Where-Object { $_.groups -match $groupname } | Select-Object user | Out-Host

| Out-String | Write-Host также можно использовать, если вы хотите указать другой цвет для вывода.

person Sage Pourpre    schedule 21.01.2020
comment
Спасибо, понятия не имел, все еще изучаю powershell. Узнал что-то новое :-) Ответ отмечен как правильный. - person Johny Wave; 21.01.2020
comment
Обратите внимание, что вы можете заменить Out-String | Write-Host на Out-Host. Отсутствие синхронизации между выводом хоста и конвейера ограничивается PS v5+ и очень специфическим, хотя и все еще распространенным сценарием: неявно форматированный табличный вывод для типов, которые не имеют данные форматирования, определенные для них - см. этот ответ. - person mklement0; 21.01.2020
comment
Только сейчас увидел ваш комментарий (вы не @-упомянули меня) - спасибо за обновление. Да, Out-Host малоизвестен, но он удобен для отправки широкоформатных представлений объектов на хост. Обратите внимание, что, помимо форматирования, еще одно важное различие между Write-Host и Out-Host заключается в том, что в PSv5+ только Write-Host записывает в информационный поток, тогда как Out-Host действительно записывает напрямую в хост, что означает, что его вывод не может быть захвачен. - person mklement0; 22.01.2020