¿Cómo detener un proceso bat en Windows?

11

Tengo un archivo BAT ejecutándose en segundo plano en Windows que dura unos diez minutos. Ahora quiero detenerlo mientras se está ejecutando, pero no puedo encontrar su nombre en la lista de procesos en el administrador de tareas. Entonces, ¿cómo puedo abordar esto? ¡Gracias!

ACTUALIZACIÓN1

Parece difícil detener un proceso BAT en ejecución en el fondo y decido tratar de eliminar todos los procesos involucrados por el archivo BAT por nombre, lo que puede ser exagerado. Es aceptable para mí ya que la mayoría de los procesos en mi archivo BAT no se usan con frecuencia, como ping, tracert, netstat, etc. Si tiene alguna solución mejor, hágamelo saber. Gracias.

ACTUALIZACIÓN2

Árbol de proceso BAT

texto alternativo

SpawnST
fuente
1
¿Cómo hiciste que el archivo bat se ejecutara en segundo plano? dices que no puedes hacer ctrl-c. Intentaría break = on si eso no funciona, pero usted dice que no puede hacer ctrl-c porque está "en segundo plano". Tal vez ya funcionó y terminó, y solo tienes que matar lo que generó.
barlop
2
@ barlop, se puede ejecutar en backgroud con ShellExecute(NULL,"open","some.bat",NULL,NULL,SW_HIDE);VC ++.
SpawnST

Respuestas:

11

Los procesos generalmente se inician de manera similar a un árbol, aconsejaría iniciar Microsoft / Sysinternals Process Explorer , comenzar haciendo clic en la Show Process Treeopción (1), luego encontrar su proceso y hacer clic derecho y elegir Kill Process Tree(2) Esto debería eliminar tanto el archivo original como todo lo que ha lanzado.

texto alternativo

William Hilsum
fuente
Matar al árbol de procesos parece un poco pesado. Puede ser suficiente matar el proceso padre (el comando bat).
wag2639
1
@ wag2639, después de leer la pregunta, ¿pensé que quería terminar con las MTD y los procesos generados? Cuando se dice que el proceso lleva tanto tiempo, entiendo que a medida que se inician los procesos y luego no sucede nada hasta que escriben una respuesta ... Si el árbol no finaliza, solo habrá un montón de procesos en ejecución que son haciendo nada.
William Hilsum
Lo intenté de esta manera y agregué la imagen en mi respuesta. Gracias. Y ahora encuentro un comando que puede matar un proceso iniciado por el archivo BAT y sus hijos taskkill /F /T /IM cmd.exe. El único problema es que cada archivo BAT iniciará un cmd.exeproceso con PID diferente Necesito averiguar cuál es mi objetivo.
SpawnST
@SpawnST, ¿qué proceso está iniciando el archivo BAT? Debe matar el elemento que lo está iniciando, si hay varias copias.
William Hilsum
@ Wil, se inició mediante un proceso de MFC / Diálogo. El diálogo solo ejecuta el archivo BAT con el shell de la ventana cuando se inicializa. Ahora estoy tratando de asegurarme de que el proceso BAT se termine por completo cuando el diálogo salga.
SpawnST
5

Puede modificar el archivo por lotes para que use un archivo de bloqueo para continuar operando, insertando comprobaciones entre comandos para la existencia del archivo. Para detener la ejecución del archivo por lotes, simplemente elimine el archivo de bloqueo.

Aquí hay un archivo por lotes de demostración:

echo xx > "c:\temp\lockfile"
pause
if not exist "c:\temp\lockfile" goto  exit
pause
del "c:\temp\lockfile"
:exit

Para eliminar violentamente los procesos que podrían estar ejecutándose en este momento, puede crear un archivo por lotes 'kill' que contendrá comandos de taskkill para todas las tareas posiblemente iniciadas desde el archivo por lotes:

del "c:\temp\lockfile"
taskkill /im mytask1.exe
taskkill /im mytask2.exe
harrymc
fuente
Esa es una buena idea, pero creo que puede causar algún problema a mi aplicación cuando un comando se ejecuta durante mucho tiempo, tracertpor ejemplo.
SpawnST
sí, eso es lo que estoy haciendo ahora, realmente violento :-). Y tal vez el archivo de bloqueo no es necesario en esta solución.
SpawnST
Es necesario para que el archivo por lotes no ejecute la siguiente tarea cuando finalice la actual. De lo contrario, podría suceder que la tarea1 finalice y la tarea2 se inicie después de que su tarea de tarea ya haya terminado, por lo que el lote de matar simplemente perderá la tarea2.
harrymc
1

Un BAT generalmente solo inicia una instancia de CMD.exe. Dependiendo de lo que haga su script, también iniciará otros procesos.

vcsjones
fuente
Entonces, ¿hay alguna manera de evitar que siga iniciando otros procesos?
SpawnST
1
@SpawnST: Si la ventana CMD está visible, ¿no puede simplemente escribir CTRL + C?
paradroid el
@ jason404, como mencioné en la pregunta, se está ejecutando en segundo plano.
SpawnST
1

Escribí una aplicación que podría ayudarte, al menos si el BAT se ejecuta en una ventana CMD. Puede ver las ventanas de la aplicación que se están ejecutando y obtener el PID de la aplicación, luego puede eliminarla con mi aplicación, también puede ver todos los procesos que ha generado y eliminarlos también. Es un programa realmente simple, pero efectivo para este tipo de cosas. También puede usarlo para localizar exactamente en qué parte de su HD se está ejecutando el archivo BAT, en caso de que aún no lo supiera.

MaQleod
fuente
Estoy haciendo este trabajo con VC ++ / MFC, y creo que necesito algunos comandos de Windows para hacerlo. Gracias por la respuesta.
SpawnST
1

¿Cómo se invoca el archivo por lotes?
Si es del Programador de tareas, también puede detenerlo desde allí. Si es de un servicio, puede detener el servicio.

weismat
fuente
0

Si lo tiene abierto en el símbolo del sistema, puede presionar Ctrl+ C. Espere unos segundos y se terminará.

Harvey Hopkins
fuente