Има ли начин да потиснете целия изход от командния ред, включително грешки, от 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 try and catch

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