Résolu Récuperer la ligne de commande réellement exécuté par Start-Process

Plus d'informations
il y a 7 mois 3 semaines #34059 par Gabriel
Bonjour

pour des raison de journalisation/debug, j'aimerais recuperer la ligne de commande exécuté par start-process:

$splatUnrar = @{
    FilePath        = $Unrar
    Argumentlist    = 'x -inul "{0}" "{1}"' -f $RARFile.FullName,$TempFolder
    Wait            = $True
    NoNewWindow        = $True
    PassThru        = $True
}

$UnrarExecution = Start-Process @splatUnrar


si j'exécute la commande en l'envoyant dans une variable $UnrarExecution avec l'option -Passthru, dans l'objet il y a une propriété commandline mais qui est vide

par contre si je met le mode verbose il y a alors 
VERBOSE: Performing the operation "Start-Process" on target "C:\Program Files\WinRAR\UnRAR.exe x -inul "D:\test\3_fail1.rar" "D:\Temp"".


et donc comme le titre l'indique j'aimerais mettre dans un journal C:\Program Files\WinRAR\UnRAR.exe x -inul "D:\test\3_fail1.rar" "D:\Temp" en meme temps que le resultat pour debug plus tard.

l'option verbose s'affiche à l'ecran, et je n'ai besoin que de la ligne de commande.

merci d'avance et bonne journée
Tonic8

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 mois 2 semaines #34061 par Arnaud Petitjean
Bonjour Gabriel, ça faisait longtemps ! Ravi de te revoir dans notre forum ! ;-)

Je n'aime pas trop la solution que je vais te proposer car elle me semble être un peu de la bidouille et je pense qu'il doit y exister une autre technique. Mais bon, je vais te la donner quand même...

L'idée à laquelle je pense est de rediriger le flux verbose dans un fichier. Ensuite, tu n'aura plus qu'à extraire ta ligne de texte depuis ton fichier. 
Le flux Verbose est le flux portant le numéro 4. Cela se fait ainsi :
Write-Verbose 'Coucou, ceci est un test' -verbose 4> ./testverbose.txt

Qu'en penses-tu ? ;-)

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 mois 2 semaines - il y a 7 mois 2 semaines #34062 par Christophe MELIN
Bonjour,

autre solution pas testée car je dois partir rapidement
1) executer la commande start-process avec le paramètre passthru
$proc = start-process -passthru ...
2) dans l'objet récupéré, il y a une propriété ID qui correspond au process ID
3) exécuter une requête WMI
$objWMI = Get-WmiObject -Class win32_process -Filter "processid=$($proc.id)"
4) l'objet objWMI a une propriété CommandLine qui contient la ligne de commande

A+
Dernière édition: il y a 7 mois 2 semaines par Christophe MELIN.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 mois 2 semaines #34076 par Gabriel
Bonsoir Arnaud

oui ca faisait un bail. merci :)

alors l'idée me plait quand même, dans le principe je tente de recuperer la ligne de commande générée, et des fois l'ordre ou un espace peut etre manquant, il y a aussi les simple quote et double quote dans les lignes de commandes, par exemple FFMPEG à une bonne tripotée de parametres.

je vais tester et je reviens

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 mois 2 semaines #34077 par Gabriel
bonsoir Christophe

je vais essayer, mais... je suis pas sur que l'analyse de l'id soit possible si le process est terminé.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 mois 2 semaines - il y a 7 mois 2 semaines #34078 par Christophe MELIN
Si tu fais la commande "$process = e start-process ... -passthru", tu récupères directement les informations dès la création du process donc il existe forcément. Après, même s'il se termine rapidement, cela ne supprime pas l'objet $process dans la session powershell. Mais c'est vrai que si le process se termine tès vite, on n'a pas forcément le temps de lancer la commande wmi.

Finalement, je crois qu'on peut s'en sortir sans passer par WMI.

Dans l'objet $process, il y a une propriété startupInfo qui est un objet avec une propriété Arguments. Cette propriété contient la concaténation des paramètres exacte faite par start-process.

Exemple : je passe la commande powershell suivante
$process = start-process notepad.exe -passthru -argumentlist 'd:\temp\toto.txt', '"titi" "toto"', "encore un argument"

alors, le résultat de $process.startupinfo | fl * est
[size=50]Verb                    :[/size]
[size=85][b]Arguments               : d:\temp\toto.txt "titi" "toto" encore un argument[/b][/size]
[size=50]CreateNoWindow          : False
EnvironmentVariables    : ...
Environment             : ...
RedirectStandardInput   : False
RedirectStandardOutput  : False
RedirectStandardError   : False
StandardErrorEncoding   :
StandardOutputEncoding  :
UseShellExecute         : True
Verbs                   : {open, runas, runasuser, sendtotoys1add...}
UserName                :
Password                :
PasswordInClearText     :
Domain                  :
LoadUserProfile         : True[/size]
[size=85][b]FileName                : C:\WINDOWS\system32\notepad.exe[/b][/size]
[size=50]WorkingDirectory        : C:\WINDOWS\system32
ErrorDialog             : False
ErrorDialogParentHandle : 0
WindowStyle             : Normal[/size]

Pour avoir une idée assez proche de la ligne de commande générée par powershell avec start-process, tu concatènes les infos :
$CommandLine = "`"$($process.startinfo.filename)`" $($process.startinfo.arguments)"

 
Dernière édition: il y a 7 mois 2 semaines par Christophe MELIN.

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.072 secondes
Propulsé par Kunena