Есть ли способ подавить весь вывод командной строки, включая ошибки, из Powershell

При вызове 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 код возврата - это все, что мне нужно зафиксировать для следующих шагов выполнения. Мне не нужен вывод на консоль.


person Terry    schedule 22.05.2019    source источник
comment
добавьте код проверки ввода в свой код Python ИЛИ в свой скрипт PoSh.   -  person Lee_Dailey    schedule 22.05.2019


Ответы (2)


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

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

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

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

Вот еще кое-что информация о перенаправлении в Powershell.

person Bender the Greatest    schedule 22.05.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')
person Terry    schedule 24.05.2019