¿Cómo puedo verificar si una aplicación se ejecuta desde un archivo por lotes (cmd)?
No necesito iniciar otra instancia si ya se está ejecutando un programa. (No puedo cambiar la aplicación para que sea solo una instancia).
Además, la aplicación podría estar ejecutándose como cualquier usuario.
windows
command-line
batch-file
Matt Lacey
fuente
fuente
Respuestas:
Otra posibilidad que se me ocurrió, inspirada en el uso de grep , es:
No necesita guardar un archivo adicional, así que prefiero este método.
fuente
tasklist /FI "IMAGENAME eq winword.exe" 2>NUL | find /I /N "winword.exe">NUL
/if %ERRORLEVEL%==1 goto wordnotrunning
para que funcione (sospechando la cita alrededor de las partes if/?
pantalla de ayuda . Así, por ejemplo,IMAGENAME
en la versión polaca esNAZWA_OBRAZU
.tasklist /FI "IMAGENAME eq myapp.exe" /NH | find /I /N "myapp.exe" >NUL
El primer NUL parece innecesario, no tengo idea de para qué sirve el '2', el / NH es opcional.Así es como lo resolví:
Lo anterior abrirá el Bloc de notas si aún no se está ejecutando.
Editar: tenga en cuenta que esto no encontrará aplicaciones ocultas de la lista de tareas. Esto incluirá cualquier tarea programada que se ejecute como un usuario diferente, ya que se oculta automáticamente.
fuente
¡Me gusta la solución de Chaosmaster! Pero busqué una solución que no inicie otro programa externo (como find.exe o findtr.exe ). Así que agregué la idea de la solución de Matt Lacey, que crea un archivo temporal también evitable. Al final pude encontrar una solución bastante simple, así que la comparto ...
Esto me está funcionando muy bien ...
fuente
La sugerencia de npocmaka de usar QPROCESS en lugar de TASKLIST es genial, pero su respuesta es tan grande y compleja que me siento obligado a publicar una versión bastante simplificada que, supongo, resolverá el problema de la mayoría de los usuarios no avanzados:
El código anterior se probó en Windows 7, con un usuario con derechos de administrador.
fuente
En Windows, puede usar el Instrumental de administración de Windows (WMI) para asegurarse de que no se inicien aplicaciones con la línea de comando especificada, por ejemplo:
wmic process where (name="nmake.exe") get commandline | findstr /i /c:"/f load.mak" /c:"/f build.mak" > NUL && (echo THE BUILD HAS BEEN STARTED ALREADY! > %ALREADY_STARTED% & exit /b 1)
fuente
Only the administrator group members can use WMIC.EXE.
seguido porReason:Win32 Error: Access is denied.
fuente
/i
.Uso PV.exe de http://www.teamcti.com/pview/prcview.htm instalado en Program Files \ PV con un archivo por lotes como este:
fuente
La respuesta de TrueY parecía la solución más elegante, sin embargo, tuve que hacer algunos cambios porque no entendía exactamente qué estaba pasando. Permítanme aclarar las cosas para, con suerte, ahorrar algo de tiempo para la próxima persona.
Respuesta modificada de TrueY:
De todos modos, espero que ayude. Sé que a veces leer la línea de comandos / lote puede ser un poco confuso a veces si eres un novato, como yo.
fuente
La respuesta proporcionada por Matt Lacey funciona para Windows XP. Sin embargo, en Windows Server 2003 la línea
devoluciones
que luego se lee mientras se ejecuta el proceso.
No tengo un montón de experiencia en secuencias de comandos por lotes, por lo que mi intención es buscar el nombre del proceso en el
search.log
archivo y bombear los resultados a otro archivo y buscar cualquier salida.Espero que esto ayude a alguien más.
fuente
Me gustan las herramientas
WMIC
yTASKLIST
, pero no están disponibles en las ediciones domésticas / básicas deQPROCESS
Windows. Otra forma es usar el comando disponible en casi todas las máquinas Windows (para las que tienen servicios de terminal, creo que solo ganan XP sin SP2, así que prácticamente todos máquina de ventanas):QPROCESS
El comando no es tan poderosoTASKLIST
y está limitado en mostrar solo 12 símbolos del nombre del proceso, pero debe tenerse en cuenta siTASKLIST
no está disponible.Uso más simple donde usa el nombre si el proceso es un argumento (el
.exe
sufijo es obligatorio en este caso cuando pasa el nombre ejecutable):La diferencia entre dos formas de
QPROCESS
uso es queQPROCESS *
enumerará todos los procesos yQPROCESS some.exe
filtrará solo los procesos para el usuario actual.El uso de
WMI
objetos a través de Windows Script Host Exe en lugar deWMIC
también es una opción. Debería ejecutarse también en todas las máquinas Windows (excluyendo aquellas en las que WSH está apagado pero este es un caso raro). Aquí el archivo bat que enumera todos los procesos a través de WMI clases y se pueden usar en lugar deQPROCESS
en el script anterior (es un híbrido jscript / bat y se debe guardar como.bat
):Y una modificación que verificará si se está ejecutando un proceso:
Las dos opciones podrían usarse en máquinas que no tienen
TASKLIST
.La última técnica es usar
MSHTA
. Esto se ejecutará en todas las máquinas con Windows desde XP y superiores y no depende de la configuración del host de script de Windows. SinMSHTA
embargo, la llamada de podría reducir un poco el rendimiento (nuevamente debe guardarse como bat):fuente
No sé cómo hacerlo con CMD incorporado, pero si tiene grep , puede intentar lo siguiente:
fuente
Solo menciono, si el nombre de su tarea es realmente largo, entonces no aparecerá en su totalidad en el
tasklist
resultado, por lo que podría ser más seguro (aparte de la localización) verificar lo contrario.Variación de esta respuesta :
fuente
Estoy asumiendo ventanas aquí. Por lo tanto, deberá usar WMI para obtener esa información. Consulte los archivos de The Scripting Guy para obtener muchos ejemplos sobre cómo usar WMI desde un script.
fuente
Utilicé el guión proporcionado por Matt (2008-10-02). Lo único con lo que tuve problemas fue que no eliminaría el
search.log
archivo. Espero porque tuve que ircd
a otro lugar para comenzar mi programa. Volvícd
a donde está el archivo BAT y estoysearch.log
, pero aún así no se eliminaría. Así que resolví eso eliminando elsearch.log
archivo primero en lugar de último.fuente
Usted debe verificar el nombre del proceso padre, véase El Proyecto Código artículo acerca de una solución basada en .NET ** .
Una forma no programática de verificar:
c:\windows\notepad.exe
)Lo mismo se puede verificar obteniendo el nombre del proceso principal.
fuente
Sobre la base de la respuesta de vtrz y la respuesta de Samuel Renkert en otro tema , se me ocurrió la siguiente secuencia de comandos que sólo se ejecuta
%EXEC_CMD%
si no se está ejecutando:Como se dijo antes, esto requiere privilegios administrativos.
fuente
Node - (computer name) ERROR: Description = Invalid query
Necesitaba una solución con un reintento. Este código se ejecutará hasta que se encuentre el proceso y luego lo matará. Puede establecer un tiempo de espera o cualquier cosa si lo desea.
Notas:
taskkill.bat
:Corre con
.\taskkill.bat ProgramToKill.exe
fuente
Por lo general, ejecuto el siguiente comando en cmd prompt para verificar si mi program.exe se está ejecutando o no:
fuente