web-dev-qa-db-fra.com

Comment capturer la sortie dans une variable à partir d'un processus externe dans PowerShell?

J'aimerais exécuter un processus externe et capturer sa sortie de commande dans une variable de PowerShell. J'utilise actuellement ceci:

$params = "/verify $pc /domain:hosp.uhhg.org"
start-process "netdom.exe" $params -WindowStyle Hidden -Wait

J'ai confirmé que la commande est en cours d'exécution, mais je dois capturer le résultat dans une variable. Cela signifie que je ne peux pas utiliser -RedirectOutput car cela redirige uniquement vers un fichier.

113
Adam Bertram

As-tu essayé:

$OutputVariable = (Shell command) | Out-String

133
JNK

Si vous souhaitez également rediriger la sortie d'erreur, vous devez procéder comme suit:

$cmdOutput = command 2>&1

Ou, si le nom du programme contient des espaces:

$cmdOutput = & "command with spaces" 2>&1
18
manojlds

Ou essayez ceci. Il va capturer la sortie dans la variable $ scriptOutput:

& "netdom.exe" $params | Tee-Object -Variable scriptOutput | Out-Null

$scriptOutput
9
Finzzownt

Un autre exemple concret:

$result = & "$env:cust_tls_store\Tools\WDK\x64\devcon.exe" enable $strHwid 2>&1 | Out-String

Notez que cet exemple inclut un chemin (qui commence par une variable d'environnement). Notez que les guillemets doivent entourer le chemin et le fichier EXE, mais pas les paramètres!

Remarque: N'oubliez pas le caractère & devant la commande, mais en dehors des guillemets.

La sortie d'erreur est également collectée.

Il m'a fallu un certain temps pour que cette combinaison fonctionne, alors j'ai pensé la partager.

8
Davidiam

J'ai essayé les réponses, mais dans mon cas, je n'ai pas obtenu le résultat brut. Au lieu de cela, il a été converti en une exception PowerShell.

Le résultat brut que j'ai obtenu avec:

$rawOutput = (cmd /c <command> 2`>`&1)
2
sevenforce

Si vous essayez uniquement de capturer le résultat d'une commande, cela fonctionnera bien.

Je l'utilise pour changer l'heure du système, car [timezoneinfo]::local produit toujours les mêmes informations, même après vous avez modifié le système. C’est le seul moyen de valider et d’enregistrer le changement de fuseau horaire:

$NewTime = (powershell.exe -command [timezoneinfo]::local)
$NewTime | Tee-Object -FilePath $strLFpath\$strLFName -Append

Cela signifie que je dois ouvrir une nouvelle session PowerShell pour recharger les variables système.

0
Kelly Davis