web-dev-qa-db-fra.com

Comment trouver les arguments de ligne de commande d'un programme en cours d'exécution?

Je cherche un outil ou une méthode pour savoir quels paramètres de ligne de commande ont été passés à un programme, par exemple lorsqu'il a été exécuté par un autre programme (scénario lanceur-application).

78
Gepard

Vous pouvez le faire en utilisant Process Explorer .

Passez simplement votre souris sur un processus pour voir les arguments en ligne de commande utilisés pour le démarrer:
enter image description here

Vous pouvez également ouvrir les propriétés properties du processus et inspecter la ligne de commande à cet endroit:
enter image description here

70
Der Hochstapler

Vous pouvez également le faire sans Process Explorer, à l'aide du service WMI de Windows. Exécutez ce qui suit à partir de l'invite de commande:

WMIC path win32_process get Caption,Processid,Commandline

Si vous voulez vider la sortie dans un fichier (cela facilite la lecture), utilisez le commutateur/OUTPUT:

WMIC /OUTPUT:C:\Process.txt path win32_process get Caption,Processid,Commandline
84
Andy E

On peut aussi y arriver en utilisant Task Manager .

Ouvrez le gestionnaire de tâches (par CTRL-SHIFT-ESC, CTRL-ALT-DELETE ou toute autre méthode).

Pour Windows 7 (et probablement Windows XP):

  • Allez dans l'onglet "Processus". Dans le menu "Affichage", sélectionnez "Sélectionner les colonnes ...".
  • Cochez la case "Ligne de commande" et cliquez sur OK. (Vous devrez peut-être faire défiler vers le bas pour le trouver)

Pour Windows 8:

  • Allez dans l'onglet "Détails". Cliquez avec le bouton droit de la souris sur l'une des colonnes (par exemple, Noms, PID, etc.) et sélectionnez "Sélectionner les colonnes".
  • Cochez la case "Ligne de commande" et cliquez sur OK. (Vous devrez peut-être faire défiler vers le bas pour le trouver)

Une colonne de lignes de commande de sera ajoutée aux colonnes actuellement affichées.

34
Jeromy Adofo

PowerShell à la rescousse.

Trouver:

Get-WmiObject Win32_Process -Filter "name = 'Perl.exe'" | where {$_.CommandLine -eq '"C:\strawberry\Perl\bin\Perl.exe" t/Server_PreFork.t'}

Et tuez en bonus:

Get-WmiObject Win32_Process -Filter "name = 'Perl.exe'" | where {$_.CommandLine -eq '"C:\strawberry\Perl\bin\Perl.exe" t/Server_PreFork.t'} | ForEach-Object { Invoke-WmiMethod -Path $_.__Path –Name Terminate }

Vous pouvez l'exécuter directement depuis powershell ou depuis un ps1 si votre système est configuré. Je détaille la configuration du script sans restriction sur je tue des zombies avec powershell ainsi que d'autres astuces de powershell ...

5
Dave Horner

Les réponses précédentes sont excellentes dans le cas où le processus est déjà en cours et ne se terminera pas de si tôt. Cependant, si vous avez besoin (comme je l'ai fait) de le faire peut-être avec des processus qui démarrent plusieurs fois et/ou se terminent rapidement, ou peut-être enregistrez des événements sur une période plus longue, il existe un moyen de le faire en utilisant Process Monitor .

Fondamentalement, il enregistre divers événements dans le système. Dans ce cas, il suffit de filtrer l'événement "Process Start" et le nom du processus à surveiller, comme indiqué ci-dessous:

 enter image description here

Ensuite, laissez simplement le moniteur de processus en cours d'exécution et faites ce que vous faites pour que le processus que vous souhaitez journaliser soit exécuté. Vous pouvez voir dans la colonne "Détails" ou la colonne "Ligne de commande" (dépend de la façon dont vous les configurez) les arguments de la ligne de commande. Par exemple:

 enter image description here

Bien entendu, vous pouvez extraire beaucoup plus d'informations connexes telles que le répertoire de travail, les variables d'environnement transmises au processus, etc. Il est également facile d'exporter les résultats dans un fichier.

4
Sil

Lorsque vous utilisez CygWin , si je lance un processus Python , il s'agit d'un exemple de ligne de commande:

c:\CygWin\bin\python2.7.exe /usr/local/bin/sudoserver.py

Mais Process Explorer ne voit que l'exe principal:

Process Explorer not detecting full command line of Python process

(notez le "chemin: [message d'ouverture du processus d'erreur]" (voir EDIT-1)). Même résultat pour tasklist:

C:\>tasklist | find "python" /i
python2.7.exe                 5740 Console                    1    15.312 KB

Donc, le seul truc que je connaisse jusqu'à maintenant, c'est de le trouver via CygWin Bash Shell pgrep:

Luis@Kenobi /cygdrive/c/
$ pgrep -f -l server.py
5740 /usr/bin/python2.7 /usr/local/bin/sudoserver.py

Il est utile de le savoir, tant que CygWin cohabite sans problème dans Windows et que vous pouvez l’utiliser pour exécuter de nombreux programmes POSIX et Python.

EDIT: Sous Windows, vous ne semblez pas avoir besoin de privilèges d’administrateur pour la liste de tâches. Dans CygWin, vous en aurez besoin pour pouvoir voir le processus d’un administrateur (ce qui me semble plus logique: la ligne de commande complète peut avoir certains paramètres comme les mots de passe à l’intérieur), nous devons donc exécuter le CygWin Bash dans elevated Mode Administrateur .

EDIT-1: Ce problème ne se produira pas si vous exécutez Process Explorer en tant qu'administrateur. Merci de nous avoir signalé, @Pacerier.

1