Comment puis-je vérifier si une application s'exécute à partir d'un fichier batch (bien cmd)?
Je n'ai pas besoin de lancer une autre instance si un programme est déjà en cours d'exécution. (Je ne peux pas changer l'application pour en faire une seule instance.)
L'application peut également être exécutée en tant que n'importe quel utilisateur.
windows
command-line
batch-file
Matt Lacey
la source
la source
Réponses:
Une autre possibilité que j'ai trouvée, inspirée de l'utilisation de grep , est:
Il n'a pas besoin d'enregistrer un fichier supplémentaire, je préfère donc cette méthode.
la source
tasklist /FI "IMAGENAME eq winword.exe" 2>NUL | find /I /N "winword.exe">NUL
/if %ERRORLEVEL%==1 goto wordnotrunning
afin de le faire fonctionner (soupçonnant la citation autour des parties if/?
écran d' aide . Ainsi, par exemple,IMAGENAME
dans la version polonaise estNAZWA_OBRAZU
.tasklist /FI "IMAGENAME eq myapp.exe" /NH | find /I /N "myapp.exe" >NUL
Le premier NUL semble inutile, je ne sais pas à quoi sert le '2', le / NH est facultatif.Voici comment je l'ai résolu:
Ce qui précède ouvrira le Bloc - notes s'il n'est pas déjà en cours d'exécution.
Modifier: notez que cela ne trouvera pas d'applications cachées dans la liste des tâches. Cela inclura toutes les tâches planifiées exécutées en tant qu'utilisateur différent, car elles sont automatiquement masquées.
la source
J'aime la solution de Chaosmaster! Mais j'ai cherché une solution qui ne démarre pas un autre programme externe (comme find.exe ou findstr.exe ). J'ai donc ajouté l'idée de la solution de Matt Lacey, qui crée un fichier temporaire également évitable. A la fin j'ai pu trouver une solution assez simple, donc je la partage ...
Cela fonctionne bien pour moi ...
la source
La suggestion de npocmaka d'utiliser QPROCESS au lieu de TASKLIST est excellente mais, sa réponse est si grande et complexe que je me sens obligé d'en publier une version assez simplifiée qui, je suppose, résoudra le problème de la plupart des utilisateurs non avancés:
Le code ci-dessus a été testé dans Windows 7, avec un utilisateur avec des droits d'administrateur.
la source
Sous Windows, vous pouvez utiliser Windows Management Instrumentation (WMI) pour vous assurer qu'aucune application avec la ligne de commande spécifiée n'est lancée, par exemple:
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)
la source
Only the administrator group members can use WMIC.EXE.
suivi deReason:Win32 Error: Access is denied.
la source
/i
.J'utilise PV.exe de http://www.teamcti.com/pview/prcview.htm installé dans Program Files \ PV avec un fichier de commandes comme celui-ci:
la source
La réponse de TrueY a semblé la solution la plus élégante, cependant, j'ai dû faire quelques farces parce que je ne comprenais pas exactement ce qui se passait. Permettez-moi de clarifier les choses pour, espérons-le, gagner du temps pour la prochaine personne.
Réponse modifiée de TrueY:
Quoi qu'il en soit, j'espère que cela aide. Je sais que parfois lire un batch / une ligne de commande peut être un peu déroutant parfois si vous êtes un peu novice, comme moi.
la source
La réponse fournie par Matt Lacey fonctionne pour Windows XP. Cependant, dans Windows Server 2003, la ligne
Retour
qui est ensuite lu pendant l'exécution du processus.
Je n'ai pas beaucoup d'expérience dans les scripts de traitement par lots, donc mon âme est de rechercher le nom du processus dans le
search.log
fichier et de pomper les résultats dans un autre fichier et de le rechercher pour n'importe quelle sortie.J'espère que ça aidera quelqu'un d'autre.
la source
J'aime les outils
WMIC
etTASKLIST
, mais ils ne sont pas disponibles dans les éditions home / basic de windows.Une autre façon est d'utiliser laQPROCESS
commande disponible sur presque toutes les machines Windows (pour celles qui ont des services terminaux - je pense que gagner XP sans SP2, donc pratiquement tous les machine Windows):QPROCESS
La commande n'est pas aussi puissanteTASKLIST
et est limitée à ne montrer que 12 symboles du nom du processus mais doit être prise en compte si elleTASKLIST
n'est pas disponible.Utilisation plus simple où il utilise le nom si le processus comme argument (le
.exe
suffixe est obligatoire dans ce cas où vous passez le nom de l'exécutable):La différence entre deux modes d'
QPROCESS
utilisation est que leQPROCESS *
listera tous les processus alors qu'ilQPROCESS some.exe
ne filtrera que les processus pour l'utilisateur actuel.Il est également possible d'utiliser des
WMI
objets via Windows Script HostWMIC
Exe au lieu de.Il devrait également être exécuté sur toutes les machines Windows (à l'exception de celles où le WSH est désactivé, mais c'est un cas rare). et peut être utilisé à la place duQPROCESS
script ci-dessus (il s'agit d'un hybride jscript / bat et doit être enregistré sous.bat
):Et une modification qui vérifiera si un processus est en cours d'exécution:
Les deux options pourraient être utilisées sur des machines qui n'en ont pas
TASKLIST
.La technique ultime utilise
MSHTA
. Cela s'exécutera sur toutes les machines Windows à partir de XP et au-dessus et ne dépend pas des paramètres d'hôte du script Windows. l'appel deMSHTA
pourrait cependant réduire un peu les performances (encore une fois, il devrait être enregistré en tant que batte):la source
Je ne sais pas comment le faire avec CMD intégré mais si vous avez grep, vous pouvez essayer ce qui suit:
la source
Il suffit de mentionner que si le nom de votre tâche est vraiment long, il n'apparaîtra pas dans son intégralité dans le
tasklist
résultat, il peut donc être plus sûr (autre que la localisation) de vérifier le contraire.Variation de cette réponse :
la source
Je suppose que des fenêtres ici. Vous devrez donc utiliser WMI pour obtenir ces informations. Consultez les archives de The Scripting Guy pour de nombreux exemples sur la façon d'utiliser WMI à partir d'un script.
la source
J'ai utilisé le script fourni par Matt (2008-10-02). La seule chose avec laquelle j'ai eu du mal, c'est qu'il ne supprimait pas le
search.log
fichier. J'attends parce que je devais allercd
à un autre endroit pour commencer mon programme. Jecd
reviens à l'endroit où se trouvent le fichier BATsearch.log
, mais il ne serait toujours pas supprimé. J'ai donc résolu cela en supprimant lesearch.log
fichier d'abord au lieu du dernier.la source
Vous devez vérifier le nom du processus parent, voir l'article The Code Project sur une solution basée sur .NET ** .
Une façon non programmatique de vérifier:
c:\windows\notepad.exe
)La même chose peut être vérifiée en obtenant le nom du processus parent.
la source
S'appuyant sur la réponse de vtrz et la réponse de Samuel Renkert sur un autre sujet , je suis venu avec le script suivant qui ne fonctionne que
%EXEC_CMD%
si elle est pas déjà en cours d' exécution:Comme cela a été dit précédemment, cela nécessite des privilèges administratifs.
la source
Node - (computer name) ERROR: Description = Invalid query
J'avais besoin d'une solution avec une nouvelle tentative. Ce code s'exécutera jusqu'à ce que le processus soit trouvé, puis le tuera. Vous pouvez définir un délai d'expiration ou quoi que ce soit si vous le souhaitez.
Remarques:
taskkill.bat
:Courir avec
.\taskkill.bat ProgramToKill.exe
la source
J'exécute généralement la commande suivante dans l'invite cmd pour vérifier si mon programme.exe est en cours d'exécution ou non:
la source