¿Cómo puedo mostrar el NOMBRE del archivo de cada proceso en ejecución desde la línea de comandos en Windows?

4

Me preguntaba cómo se podría obtener el NOMBRE de un archivo si uno tiene el PID del proceso en ejecución.

Decir si tengo 2 archivos de texto notepad.exe ejecutándose consecutivamente y ejecuto en la línea de comandos (código cortesía 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

Me sale el resultado:

6624 7124

¿Qué nombre de archivo de texto es PID 6624? o ¿Qué nombre de archivo de texto es PID 7124?

diga que PID 6624 es 'findme1.txt' y PID 7124 es findme2.txt '

No sé cuál de los procesos PID para MATAR.

Podría matar el proceso equivocado y perder información vital ...

En otras palabras: cuál de los archivos findme * .txt anteriores es findme1.txt y ¿cuál de los archivos findme * .txt anteriores es findme2.txt?

Solo deseo matar findme1.txt y NO findme2.txt que contiene información vital del sistema, por ejemplo.

Cualquier sugerencia será muy bienvenida y apreciada por mí. Muchas gracias por adelantado.

dzur
fuente
Tratar "tokens=2,9 delims=," y lista de tareas con /v parámetro detallado y luego … do @echo %~F:%~G.
JosefZ

Respuestas:

0

Lo que está buscando es el nombre del archivo en el que está trabajando cada proceso, si corresponde.

fondo

El problema es que el nombre del archivo en el que se está trabajando (a diferencia del nombre del archivo ejecutable) normalmente no se muestra en el resultado de la lista de tareas, o el resultado de cualquier otra herramienta de línea de comandos estándar que conozca.

Un proceso siempre tiene una lista interna de los archivos que tiene abiertos, estos están en el proceso "tabla de manejadores". Esto es visible en, por ejemplo. Explorador de procesos, pero desea una herramienta de línea de comandos. Y no hay una forma general de saber, entre todos los archivos que un proceso tiene abierto, cuál es el documento que el proceso está abierto para editar.

Sin embargo. Algunas aplicaciones, incluidos el Bloc de notas, el conjunto de aplicaciones de Office y muchas otras, establecen el nombre del archivo en el título de su ventana. p.ej. "Notepad file1.txt" Esto no es consistente de una aplicación a otra. Una aplicación puede establecer su título de Windows a lo que quiera. Un programa podría, por ejemplo, poner su propio nombre primero y luego el nombre del archivo. Lo que sea.

Por lo tanto, desea mirar los títulos de las ventanas. El Administrador de tareas puede mostrar los títulos de las ventanas, pero usted desea una herramienta de línea de comandos. Como señala JosefZ, tasklist / v puede hacer esto. (También hay un pequeño programa llamado tlist que lo hará. Viene con el paquete de herramientas de depuración de Windows.) Sin embargo, estos le mostrarán, además de los procesos que desea, una gran cantidad de procesos que no tienen nombres de ventanas. .

responder

¡PowerShell al rescate! Intente esto en su símbolo del sistema: (No tiene que estar en c: \, es solo un ejemplo)

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

Esto mostrará una lista de todos los procesos que tienen un título de ventana no vacía.

Si solo quieres ver los procesos que ejecutan un programa en particular, como el bloc de notas, puedes poner ese nombre antes de la primera canalización, así:

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

Esto filtra la salida de get-Process antes de que llegue al resto de los comandos. El comando where-Object filtra los títulos de las ventanas que no están vacíos, y la tabla de formato simplemente coloca el resultado en una tabla ordenada.

Ahora, hagámoslo más fácil. Coloque lo siguiente en un archivo .cmd, digamos que lo llama wn.cmd (wn para windowname). Ponga wn.cmd en algún directorio que esté en su ruta. (Siempre creo un directorio llamado c: \ progs y lo agrego a mi ruta, para pequeñas cosas como esta. También coloco las herramientas de sysinternals en ese directorio).

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

ejemplos

Ahora, en el símbolo del sistema ... asumiendo que wn.cmd está en algún lugar de su ruta ... puede simplemente escribir

c:\> wn

y obtendrás la lista completa de procesos con ventanas nombradas ... así:

   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

y si escribe por ejemplo

c:\> wn notepad

obtienes solo los que están ejecutando el bloc de notas:

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

(Esta selección va por el nombre del ejecutable, no por el título de la ventana).

Crédito a quien crédito merece: Encontré el "script" original de powershell para listar procesos con ventanas con nombre de esta página en powershell.com . Empaquetarlo en un archivo .cmd hace que sea más fácil de usar.

Jamie Hanrahan
fuente
Gracias Jamie. Suponiendo que conoce ADVANCE el texto del nombre del archivo ejecutable que no desea eliminar: 'dontkillit.txt' Cómo desarrollar aún más el código para no matar el archivo vital del bloc de notas y eliminar los necesarios para lograr esto con una entrada de línea de comando SINGLE. Algo así como (línea de comando lógica del curso) 'TASKKILL / PID (de killit1.txt) / PID (de killit2.txt) pero no mata el PID de dontkillit.txt' De hecho, 'wn notepad' le ofrece a cada PID una relación Nombre del archivo de texto de la libreta. con esta información PID ahorre el texto vital del bloc de notas al escribir UNA entrada de línea de comando.
dzur
("dontkillit.txt" no es el nombre del archivo ejecutable). Quieres un solo comando que, por ejemplo, ¿Desea eliminar todos los procesos de notepad.exe que no tengan ningún archivo especificado? Eso parece un poco arriesgado. ¿Qué pasa si se equivoca al escribir el nombre de su archivo importante? El script entonces mataría todos los procesos de la libreta.
Jamie Hanrahan