¿Cómo obtener el comando que invocó una tarea con la lista de tareas?

18

El administrador de tareas de Windows tiene una columna llamada Línea de comando que muestra el comando que inició la tarea dada, con todos los modificadores y parámetros, por ejemplo:

test.exe -V -A 127.0.0.1 -P 6062

Ahora tengo que identificar una determinada tarea que está escuchando en un determinado puerto y / o fue llamada con una determinada combinación de conmutadores. Mi objetivo es cerrar la tarea seleccionada, pero no otras, por lo que si hay varias test.exetareas en ejecución, no puedo simplemente cerrar todas las tareas devueltas por:

tasklist /fo csv /nh /fi "imagename eq test.exe"

Desafortunadamente, parece que ni tasklistni pslist( aquí ) es capaz de devolver el campo Línea de comando . ¿Cómo puedo superar este problema?

István Zachar
fuente
Tal vez pueda hacer algo con el netstat -aon | grep \.0:6062puerto 6062 y la última columna sería el PID de su programa. No estoy seguro si eso es suficiente para ti. tasklist /FI "PID eq <PID>"daría su ejecutable de nuevo.
Rik
@Rik Lamentablemente, eso no es suficiente, ya que el puerto en sí no es suficiente para identificar la tarea correcta, por lo que también es necesario ver los argumentos de la línea de comandos.
István Zachar
No puedo imaginar que varios programas escuchen en el mismo puerto ... :) Pero debe ser posible obtener los parámetros ... process explorerde Sysinternals puede mostrarlos en la interfaz gráfica de usuario. Entonces la información debe estar en alguna parte.
Rik
¿Tiene uso para un comando powershell? Me gusta <<< Get-WmiObject win32_process -Filter "nombre como '% test.exe'" | seleccione CreationDate, ProcessId, CommandLine | ft -AutoSize` >>> Vea aquí
Rik
@Rik, el puerto es, por supuesto, diferente, pero también tengo que extraer los argumentos de la línea de comando para verificar si la tarea es la que necesito matar.
István Zachar

Respuestas:

35

Que tal este:

wmic process where caption="test.exe" get commandline

Y si haces esto, también obtienes el ProcessId para matar:

wmic process where caption="test.exe" get commandline,processid

wmicTambién tiene un interruptor para salida a csv. Entonces:

wmic /output:c:\temp\proc.csv process where caption="test.exe" get commandline,processid /format:csv

Nota: Si obtiene un error con el último ( Invalid XSL format (or) file name), debe copiar csv.xmlde %WINDIR%\System32\wbem\en-USa %WINDIR%\System32\wbem. Puedes leer sobre este error aquí .


También podría usar PowerShell:

Get-WmiObject win32_process -Filter "name like '%test.exe'"|select CreationDate,ProcessId,CommandLine|ft -AutoSize`
Rik
fuente
Gracias, eso es todo, wmicresuelve el problema, y ​​esto concluye el día. :)
István Zachar
1
Perfecto: esto realmente proporciona la línea de comando completa. En el administrador de tareas, solo muestra los primeros 300 caracteres más o menos.
ArtOfWarfare