Сохранение новых строк в Powershell For Loop - PullRequest
1 голос
/ 17 апреля 2019

У меня есть список DisplayNames, и я не хочу искать каждое из SamAccountNames, но когда я это сделаю, я хочу оставить пустую строку, когда SamAccountName не найдено.Прямо сейчас, когда я запускаю его с моим списком из 400 DisplayNames, получается только 350, но я не знаю, где эти 50 в моем списке отсутствуют.Сейчас у меня есть:

Get-Content C:\list.txt | ForEach-Object {(Get-ADUser -Filter {DisplayName -eq $_}).SamAccountName}

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

Итак, вместо чего-то вроде этого:

jonesb
williamsj

bakere

Я получаю:

jonesb
williamsj
bakere

Ответы [ 3 ]

1 голос
/ 17 апреля 2019

400 DisplayNames минус 350 SamAccountNames дает 10?

Я бы предпочел вывод, где вы видите DisplayName, для которого SamAccountName не может быть оценено.

$Data = foreach ($DisplayName in (Get-Content C:\list.txt)){
    [PSCustomObject]@{
        DisplayName    = $DisplayName
        SamAccountName = (Get-ADUser -Filter "DisplayName -eq '$DisplayName'").SamAccountName
    }
}
$Data | Out-GridView
$Data | Export-Csv C:\list.csv -NoTypeInformation
1 голос
/ 17 апреля 2019

Вы можете сделать это с помощью оператора If внутри цикла ForEach-Object, захватив результаты вызова Get-ADUser, а затем выведя имя samaccount, если пользователь был найден, и выведя пустую строку, если он не был 'т найдено.

Get-Content C:\list.txt | 
    ForEach-Object {
        If(($User=Get-ADUser -Filter "DisplayName -eq '$_'")){
            $User.SamAccountName
        }else{
            ''
        }
    }
0 голосов
/ 17 апреля 2019

Во-первых, отступим: лучше избегать использования блоков скриптов ({ ... }) в качестве -Filter аргументов , поэтому в приведенном ниже решении используется аргумент string .


  • Использование Get-AdUser с аргументом -Filter, который не соответствует никому из пользователей, спокойно возвращает «ничто» (фактически, $null) и, как следствие, доступ к свойству .SamAccountName для этого «ничего» возвращает $null.

  • Хотя такой $null присутствует на выходе , он не печатает ; вы можете сделать его печатным - как пустую строку - если вы приведете его к строке :

Таким образом:

Get-Content C:\list.txt | ForEach-Object {
  [string] (Get-ADUser -Filter "DisplayName -eq `"$_`"").SamAccountName
}

Однако для обеспечения контекста рассмотрите возможность вывода экземпляра [pscustomobject] на каждой итерации, которая включает отображаемое имя ввода, как показано в полезном ответе LotPings .

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