Есть ли способ превзойти весь вывод командной строки, включая ошибки, из Powershell - PullRequest
1 голос
/ 22 мая 2019

При вызове Powershell из скрипта Python (subprocess.Popen) я перебираю список контроллеров домена AD.Для каждого контроллера, который не может распознать объект AD, я хочу подавить ошибочный вывод.

Использование | Out-Null в конце команды Powershell не имеет никакого эффекта.

Скрипт Python:

for server in ADDomainList:
    cmd = 'powershell.exe get-ADComputer ' + hname + ' -Server ' + server + ' | Out-Null'
    subprocess.call(cmd)

Из командной строки Powershell:

get-ADComputer computer-name -Server server.domain.com

Нежелательный вывод:

Get-ADComputer : A positional parameter cannot be found that accepts argument '?'.
At line:1 char:1
+ get-ADComputer computer-name -Server server.domain.com ?
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ADComputer], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.ActiveDirectory.Management.Commands.GetADComputer

Результат кода возврата 0 или 1 - это все, что мне нужно захватить для следующего выполненияшаги.Я не хочу выводить данные на консоль.

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Вот еще одно решение, использующее преимущества PowerShell. функция "попробуй и поймай". Используя это в цикле, заблудший ответы исключены.

Я нахожу нужный мне сервер с PowerShell и пытаюсь поймать

cmd = 'powershell.exe try{get-ADComputer ' + hname + ' -Server 
' + server + ' | Out-Null}catch{}'

Как только у меня есть правильный сервер, я использую '| Out-Null ', чтобы избавиться от стандартный вывод PowerShell.

subprocess.Popen('powershell.exe get-ADComputer ' + hname + ' 
-Server ' + sname + ' -Properties '
'OperatingSystem,PasswordLastSet | Export-CSV adcomputer.csv - 
Delimiter "*" -NoTypeInformation | Out-Null')
0 голосов
/ 22 мая 2019

Перенаправить все потоки на ноль, как это *> $null.Это не приведет к выводу.

cmd = 'powershell.exe get-ADComputer ' + hname + ' -Server ' + server + ' *> $null'

Если вы хотите передать по каналу Out-Null или любому другому командлету, вы также можете перенаправить весь вывод в поток успеха и направить в другой командлет следующим образом:

cmd = 'powershell.exe get-ADComputer ' + hname + ' -Server ' + server + ' *>&1 | Out-Null'

Вот еще немного информации о перенаправлении в Powershell.

...