3 votes

Comment puis-je afficher le NOM du fichier de chaque processus en cours d'exécution à partir de la ligne de commande dans Windows ?

Je me demandais comment on pouvait obtenir le NOM d'un fichier si on avait le PID du processus en cours.

Disons que j'ai 2 fichiers texte notepad.exe qui s'exécutent consécutivement et que j'exécute à la ligne de commande (code courtoisie de : https://stackoverflow.com/questions/13507902/how-to-extract-a-specific-field-from-output-of-tasklist-on-the-Windows-command-l ) :

for /f "tokens=2 delims=," %F in ('tasklist /nh /fi "imagename eq notepad.exe" /fo csv') do @echo %~F

J'obtiens le résultat :

6624 7124

Quel nom de fichier texte est le PID 6624 ? ou Quel nom de fichier texte est le PID 7124 ?

disons que le PID 6624 est 'findme1.txt' et le PID 7124 est 'findme2.txt'.

Je ne sais pas lequel des processus PID il faut KILL.

Je pourrais tuer le mauvais processus et perdre des informations vitales...

En d'autres termes : lequel des fichiers findme*.txt ci-dessus est findme1.txt ? et lequel de ces fichiers findme*.txt est findme2.txt ?

Je souhaite seulement tuer findme1.txt et PAS findme2.txt qui contient des informations système vitales, par exemple.

Toute suggestion sera la bienvenue et appréciée par moi. Merci beaucoup d'avance.

1voto

Jamie Hanrahan Points 22184

Ce que vous recherchez, c'est le nom du fichier sur lequel chaque processus travaille - le cas échéant.

arrière-plan

Le problème est que le nom du fichier sur lequel on travaille (contrairement au nom du fichier exécutable) n'est pas normalement affiché dans la sortie de la liste des tâches, ou dans la sortie de tout autre outil de ligne de commande standard que je connais.

Un processus dispose toujours d'une liste interne des fichiers qu'il a ouverts - ceux-ci se trouvent dans la "table des poignées" du processus. Cette liste est visible dans l'Explorateur de processus, par exemple, mais vous avez besoin d'un outil en ligne de commande. Et il n'y a pas de moyen général de savoir, parmi tous les fichiers qu'un processus a ouvert, lequel est le document que le processus est ouvert pour éditer.

Cependant. Certaines applications, dont le Bloc-notes, la suite Office et bien d'autres, définissent le nom du fichier dans le titre de leur fenêtre, par exemple "Bloc-notes fichier1.txt". Une application peut définir le titre de sa fenêtre comme elle le souhaite. Un programme peut, par exemple, mettre son propre nom en premier et ensuite le nom du fichier. Peu importe.

Donc, vous voulez regarder les titres des fenêtres. Le gestionnaire de tâches peut afficher les titres des fenêtres, mais vous voulez un outil en ligne de commande. Comme le note JosefZ, tasklist /v peut le faire. (Il existe également un petit programme appelé tlist qui peut le faire. Il est fourni avec le paquetage Windows Debugging Tools). Cependant, ces programmes vous montreront, en plus des processus que vous voulez, tout un tas de processus qui n'ont pas de nom de fenêtre.

réponse

PowerShell à la rescousse ! Essayez ceci à votre invite de commande : (Vous n'êtes pas obligé d'être à c:\, c'est juste un exemple)

c:\> powershell -command "get-Process | where-Object {$_.mainWindowTitle} | format-table id,name,mainwindowtitle -AutoSize"

Cela permettra de lister tous les processus qui ont un titre de fenêtre non vide.

Si vous voulez seulement voir les processus qui exécutent un programme particulier - comme Notepad - vous pouvez mettre ce nom avant le premier tuyau, comme ceci :

c:\> powershell -command "get-Process notepad | where-Object {$_.mainWindowTitle} | format-table id,name,mainwindowtitle -AutoSize"

Cela filtre la sortie de get-Process avant qu'elle n'atteigne le reste des commandes. La commande where-Object filtre les titres de fenêtres non vides, et la commande format-table met simplement le résultat dans un tableau soigné.

Maintenant, rendons les choses plus faciles. Mettez ce qui suit dans un fichier .cmd, disons que vous l'appelez wn.cmd (wn pour windowname). Mettez wn.cmd dans un répertoire qui est dans votre chemin. (Je crée toujours un répertoire appelé c : \progs et ajouter ça à mon chemin, pour des petites choses comme ça. Je mets aussi les outils sysinternals dans ce répertoire).

c:\> @echo off
c:\> powershell -command "get-Process %1 | where-Object {$_.mainWindowTitle} | format-table id,name,mainwindowtitle -AutoSize"

exemples

Maintenant, à l'invite de commande... en supposant que wn.cmd est quelque part dans votre chemin... vous pouvez simplement taper

c:\> wn

et vous obtiendrez la liste complète des processus avec le nom de Windows comme ceci :

   Id Name           MainWindowTitle
   -- ----           ---------------
 9596 chrome         How can I show the file NAME of each running process from the command-line in Windows? - Super ...
11980 cmd            Command Prompt - wn
10164 explorer       progs
10180 Horas          Horas - Fri 11
 2520 notepad        windownames.ps1 - Notepad
15348 notepad        notes2.txt - Notepad
 8304 OUTLOOK        Inbox - mailbox - Outlook
17312 powershell_ise Windows PowerShell ISE
 6140 TTool103       Alarm

et si vous tapez par exemple

c:\> wn notepad

vous n'obtenez que ceux qui utilisent Notepad :

   Id Name    MainWindowTitle
   -- ----    ---------------
 6240 notepad Untitled - Notepad
13096 notepad wn.cmd - Notepad
15348 notepad notes2.txt - Notepad

(Cette sélection se fait par le nom de l'exécutable, pas par le titre de la fenêtre).

Le crédit où le crédit est dû : J'ai trouvé le powershell original "script" pour lister les processus avec des Windows nommés à partir de cette page à powershell.com . L'empaqueter dans un fichier .cmd le rend plus facile à utiliser.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X