Использование текстового файла для циклического выполнения команды PowerShell - PullRequest
0 голосов
/ 10 сентября 2018

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

test.txt:

"ou=MyOU1,dc=Mydomain,dc=net"
"ou=MyOU2,dc=Mydomain,dc=net"
"ou=MyOU3,dc=Mydomain,dc=net"

Я передаю эту команду в PowerShell:

Get-Content .\test.txt | Out-String | ForEach-Object {
    (Get-ADUser -Filter * -SearchBase "$_").Count
}

Я получаю следующую ошибку:

Get-ADUser : The supplied distinguishedName must belong to one of the
following partition(s): 'DC=Mydomain,DC=net ,
CN=Configuration,DC=Mydomain,DC=net ,
CN=Schema,CN=Configuration,DC=Mydomain,DC=net ,
DC=ForestDnsZones,DC=Mydomain,DC=net ,
DC=DomainDnsZones,DC=Mydomain,DC=net'.
At line:1 char:62
+ ... ing) | ForEach-Object {(Get-ADUser -Filter * -SearchBase "$_").Count}
+                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ADUser], ArgumentException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.GetADUser

Однако, когда я запускаю OU по отдельности, он работает.

PS> (Get-ADUser -Filter * -SearchBase "ou=MyOU1,dc=Mydomain,dc=net").Count
10782

1 Ответ

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

Примечание: Использование Out-String не только не нужно в вашем коде, но фактически создает одиночную строку вывода, что приводит к сбою вашей команды , поскольку ForEach-Object являетсязатем вызывается один раз , с многострочной строкой .

Get-Content сама отправляет строки текстового файла по конвейеру отдельно, чтоВы хотите:

Get-Content .\test.txt | foreach-object {
  (get-aduser -filter * -searchbase $_).count
}

Обратите внимание, что $_ уже является строкой, поэтому вам не нужно заключать ее в "...".

Кроме этого, , если строки в вашем файле действительно содержат "..." -замкнутые строки, как показывает ваш пример ввода (вероятно, нет, поскольку сообщение об ошибке не отражает их), и вы не можете исправить сам файл, вам придется удалите эти двойные кавычки, иначе они станут частью строки , которая передается в -SearchBase:

Get-Content .\test.txt | foreach-object {
  (get-aduser -filter * -searchbase ($_ -replace '"')).count
}
...