¿Cómo puedo saber qué proceso “explorer.exe” es el principal?

13

Tengo un archivo de proceso por lotes que cambia algunos archivos de registro y luego reinicia explorer.exe para que tengan efecto. Estoy usando los comandos

taskkill /f /im explorer.exe
explorer.exe

Esto por supuesto mata todos Los procesos de explorer.exe, incluidas las ventanas del explorador que tengo abiertas. (Obviamente, estoy usando la opción de Launch folder windows in a separate process.)

¿Hay alguna manera de que pueda determinar qué instancia de explorer.exe es la principal y simplemente eliminarla?

HodofHod
fuente
Matar el explorer.exe principal probablemente matará a todos los demás, ya que dependen de él para ejecutarse.
cutrightjm
1
@ekaj No lo hace. Soy capaz de hacerlo manualmente. Cada ventana es un proceso independiente.
HodofHod
Estoy interesado en encontrar una manera confiable de determinar la principal (asociada con el escritorio) explorer.exe ejemplo también, pero por la razón opuesta. Me parece molesto que engendró explorer.exe los procesos no siempre se cierran cuando todas sus ventanas asociadas están cerradas. Utilizo el Administrador de tareas para eliminarlos, y tiendo a confiar en el hecho de que las instancias generadas generalmente se establecen en prioridad alta (por alguna razón). Esto funciona bien, pero si lo puse en normal (por razones obvias), corro el riesgo de matar accidentalmente el proceso primario.
Synetech
@Synetech La solución a eso es taskkill /f /im explorer.exe /fi "windowtitle ne N/A". Por alguna razón, copiar / pegar eso en el indicador de cmd no funciona; Tienes que escribirlo a mano. No probé un archivo por lotes.
HodofHod
1
Ha dividido el problema en una parte fácil e imposible, resolvió la parte fácil y ahora está pidiendo ayuda con la parte imposible. Es muy probable que la parte "fácil" de la solución no sea correcta (por ejemplo, lo que está intentando hacer podría lograrse con una política de grupo), por lo que sería bueno que su pregunta incluyera el problema original que está tratando de resolver. . Los procesos de matanza que no le pertenecen a usted rara vez son correctos.
Simon Richter

Respuestas:

9

Título basado en el título de la ventana

@ techie007 sugirió matando al explorer.exe con titulo de ventana N/A.

Mando

for /f "tokens=2,10" %%p in ('tasklist /nh /v /fi "imagename eq explorer.exe"') do if "%%q"=="N/A" taskkill /f /pid %%p

Cómo funciona

  • tasklist /nh /v /fi "imagename eq explorer.exe" Enumera verbalmente todos los procesos con nombre de imagen explorer.exe.

  • for /f "tokens=2,10" %%p in ('COMMAND1') do COMMAND2

    ejecuta COMMAND1. Para cada línea de salida, establece las variables. %%p y %%q al segundo y décimo "token" (delimitado por espacio) y se ejecuta COMMAND2.

    En el caso de taskkill /v, %%p ahora tiene el PID y %%q El (inicio de) el título de la ventana.

  • if "%%q"=="N/A" taskkill /f /pid %%p comprueba si el título de la ventana es N/A.

    Si es así, termina el proceso con taskkill.

Enfoque basado en el uso de la memoria.

@Syntech señaló esto no es confiable para el Explorador de Windows, pero en los programas, el proceso principal siempre tiene el mayor uso de memoria.

Mando

for /f "tokens=2" %%p in ('tasklist /nh /fi "imagename eq explorer.exe" ^| sort /+65') do @set explorerpid=%%p
taskkill /f /pid %explorerpid%

Cómo funciona

  • tasklist /nh /fi "imagename eq explorer.exe" Enumera todos los procesos con nombre de imagen explorer.exe.

  • sort /+65 ordena la salida anterior comenzando con el carácter 65 (donde comienza el uso de memoria).

  • for /f "tokens=2" %%p in ('COMMAND') do @set explorerpid=%%p conjuntos explorerpid a la segunda tokens=2 ) entrada - delimitada por espacios - de cada línea de la salida de COMMAND, que es el PID correspondiente.

  • Ya que tasklist La salida ha sido ordenada, explorerpid sostiene el PID reclamado, y taskkill termina el proceso.

Dennis
fuente
¡Gracias! Pero, por alguna razón, esto todavía no funciona para mí. Estoy trabajando para ver si puedo modificarlo de alguna manera para que funcione.
HodofHod
1
@Dennis, & gt; para configurar explorerpid en el PID del explorer.exe con el mayor uso de memoria. Esa debería ser la manera más confiable de determinar el proceso principal. No, no es correcto. Abra un nuevo proceso de ventana (por ejemplo, a través de un acceso directo), navegue a una carpeta con muchas fotos y véalas en modo miniatura. El nuevo proceso superará rápidamente al original en el uso de la memoria. & gt; Bueno, no mencionaste que no estás usando la configuración predeterminada. La pregunta es ¿Cómo puedo saber qué proceso "explorer.exe" es el principal? ¿De qué otra manera crees que podría ser un problema?
Synetech
Tanto el enfoque de ventana como el de memoria ahora funcionan. Creo que me voy con la ventana - parece más confiable. ¡Muchas gracias!
HodofHod
3

Quizás pueda decirle al Explorador que muestre la ruta en la barra de título y luego usar la WINDOWTITLE ¿Filtrar para matarlo basado en eso?

  • Abrir explorador
  • prensa Alt
  • Haga clic en "Herramientas (elemento del menú)"
  • Haga clic en "Opciones de carpeta ... (elemento del menú)"
  • Haga clic en "Ver (pestaña de página)" en "Opciones de carpeta"
  • Haga clic para seleccionar "Mostrar la ruta completa en la barra de título (solo tema clásico)" en "Opciones de carpeta"
  • Haga clic en "Aplicar" - & gt; "DE ACUERDO"

La ruta no se mostrará en la barra de título de Explorer con los temas "no clásicos", pero está (ahora) allí; Simplemente no es visible.

taskkill /F /FI "WINDOWTITLE eq C:\PathToThing\RunningInExplorer\ToRestart*"

Es posible que deba cambiar temporalmente a un tema clásico para determinar cuál es la ruta / título para la instancia de Explorer que desea reiniciar.

No 100% a prueba de errores, pero cualquier ventana del Explorador que no tenga esa ruta (parcial) en el título sería al menos segura. :)

editar:

Ya que desea capturar el que tiene el título "N / A", probablemente tendrá que usar un archivo por lotes para poder tokenizar los resultados de una TASKLIST y usar esos token para usar TASKKIL para matar por PID.

Encontré una respuesta a StackOverflow.com que aborda esto:

De la pregunta Taskkill un proceso sin título? es esta respuesta que incluye este ejemplo de archivo por lotes:

@echo off
SETLOCAL enabledelayedexpansion
for /f "tokens=*" %%a in ('TASKLIST /V') do (
  set s=%%a
  set p=!s:~27,5!
  set t=!s:~152,3!
  if '!t!'=='N/A' ECHO TASKKILL /PID !p! /T
)

Querrá cambiar el comando 'TASKLIST / V' para que sea más específico de Explorer.exe, pero debería darle un buen punto de partida.

Ƭᴇcʜιᴇ007
fuente
El proceso que quiero matar es el principal. tasklist /fi "imagename eq explorer.exe" /v /fo list Me dice que su título de ventana es "N / A". Desafortunadamente, `" windowtitle eq N / A "no funciona. ¿Algunas ideas?
HodofHod
Ahhhhhh gotcha Encontré una respuesta a eso en StackOverflow, actualizaré la respuesta con los bits relevantes aquí con un enlace.
Ƭᴇcʜιᴇ007
Todavía no veo cómo funcionaría esto. ¿Qué pasa si no hay ventanas abiertas del Explorador que no sean el escritorio?
Synetech
1

Elimine el proceso con el PID más bajo (ID de proceso). Se habría iniciado primero, ya que los procesos se numeran secuencialmente.

Mythrillic
fuente
+1 Esto funcionaría la primera vez que se ejecuta el archivo por lotes, pero como se reinicia explorer.exe, el nuevo proceso "principal" tendrá un PID más alto. ¿Hay otra manera?
HodofHod
Esto es verdad. Sin embargo, usted podría simplemente salir tasklist | find /f "explorer" y pregunte, luego solo pregunte (con la entrada del usuario) cuál es el PID más bajo para eliminar.
Mythrillic
@HodofHod: la forma más confiable sería seleccionar el proceso con el mayor uso de memoria. Si puedes usar MinGW ( sed, awk, etc.), que bastante fácil de hacer automáticamente. Si no, la entrada del usuario podría ser la mejor opción.
Dennis
@ Adam543i, & gt; Cancele el proceso con el PID más bajo (ID de proceso). Se habría iniciado primero, ya que los procesos se numeran secuencialmente. ¿De qué versión de Windows estás hablando? Esto simplemente no es cierto. Aparte de la función de seguridad PID aleatoria, recuerdo algo en OldNewThing sobre la asignación de PID en intervalos (de cuatro o 16 o algo así). El hecho es que el uso de PID (incluso los relativos) es demasiado poco confiable.
Synetech
@Dennis, & gt; La forma más confiable sería seleccionar el proceso con el mayor uso de memoria. No De ningún modo. Es extremadamente fácil para un proceso generado tener un mayor uso de memoria.
Synetech