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.
As-tu essayé:
$OutputVariable = (Shell command) | Out-String
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
Ou essayez ceci. Il va capturer la sortie dans la variable $ scriptOutput:
& "netdom.exe" $params | Tee-Object -Variable scriptOutput | Out-Null
$scriptOutput
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.
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)
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.