Форматирование вывода команды foreach - PullRequest
0 голосов
/ 30 января 2019

Я новичок в Powershell и не могу понять, как отформатировать вывод этого цикла foreach oneliner.

foreach ($user in cat C:\list.txt) {Get-ADUser $user | select -Property             
GivenName,Surname,SamAccountName}

GivenName Surname    SamAccountName
--------- -------    --------------
Bob       Smith      SmithB
Fred      Williams   WilliamsF
Ann       Jones      JonesA
Joan      Scott      ScottJ
Eve       Wood       WoodE
George    Peters     PetersG
Alice     Watt       Watt

C: \ list.txt содержит список SamAccountName,по одному на строку.

Мне нужно, чтобы вывод выглядел следующим образом:

Bob Smith SmithB; Fred Williams WilliamsF; Ann Jones JonesA; Joan Scott ScottJ; Eve Wood WoodE; George Peters PetersG; Alice Watt Watt

Я также хотел бы избежать создания каких-либо новых файлов в процессе.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Краткое решение (PSv2 +):

(Get-Content C:\list.txt | Get-ADUser | ForEach-Object {
  '{0} {1} {2}' -f $_.GivenName, $_.SurName, $_.SamAccountName
}) -join ';'
  • Get-Content C:\list.txt | Get-ADUser использует конвейер для предоставления имен пользователей для Get-ADUser (который неявно связываетвходные строки с параметром -Identity);В результате получается массив объектов пользователей AD.

    • Использование конвейера против цикла foreach имеет компромиссы (потребление памяти и скорость);однако, если не существует известной проблемы с производительностью, конвейер предлагает более сжатые и элегантные решения.
  • Передача результата в командлет ForEach-Object (%) позволяет обрабатыватьрезультирующий пользовательский объект AD один за другим через блок сценария ({ ... }), в котором $_ представляет текущий объект ввода.

  • '{0} {1} {2}' -f $_.GivenName, $_.SurName, $_.SamAccountName использует -f,Оператор форматирования строки PowerShell для построения строки из свойств данного пользовательского объекта.Обратите внимание, что нет необходимости в промежуточном вызове select (Select-Object), поскольку вы можете получить доступ к интересующим свойствам непосредственно в пользовательском объекте AD.

  • Заключение всего конвейерав (...) получается массив строк [1] , который -join затем соединяется, образуя единственную выходную строку с ; в качестве разделителя.


[1] Строго говоря, если C:\list.txt содержит только имя 1 , то на выходе будет скаляр , т.е. одиночная строка .Тем не менее, оператор -join также принимает скаляр в качестве LHS, и в этом случае операция является неактивной (нечего присоединяться).

0 голосов
/ 30 января 2019

Простое решение будет:

$result = '';
foreach ($user in cat C:\list.txt) {
  $adUser = Get-ADUser $user | select -Property GivenName,Surname,SamAccountName
  $result += [string]::Format("{0} {1} {2}; ", $adUser.GivenName, $adUser.Surname, $adUser.SamAccountName)
}
$result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...