2017-03-23 1 views
1

J'essaie donc de créer une variable à partir de la sortie de la commande ci-dessous dans un fichier batch. Il fonctionne très bien à l'invite de commande où je reçois l'ID de processus 1292:Utilisation de deux critères avec wmic et tentative de création d'un fichier batch var

C: \ Documents and Settings \ user> processus wmic où (name = "de cmd.exe" et CommandLine comme « %%% file d'attente% %% ") se ProcessID

qui retourne

ProcessId 
1292 

si je fais ce que je reçois le retour, je besoin si une seule instance est en cours d'exécution:

for /f "tokens=*" %%f in ('wmic process get processid /value ^| find "="') do set "%%f" 
echo processid is %processid% 

Cependant, je voudrais utiliser la combinaison de contenu multiple car si je veux obtenir l'identificateur de processus pour un exe qui s'exécute plusieurs fois, au moins je peux le réduire.

Toutes les suggestions seraient appréciées.

Répondre

0

Essayez avec quelque chose comme

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "queue=testing" 

    for /f "tokens=2 delims==" %%a in (' 
     wmic process 
     where "name='cmd.exe' And commandLine like '%%%queue%%%'" 
     get ProcessID /value 
    ') do echo %%a 

ou

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "queue=testing" 

    for /f "tokens=2 delims==" %%a in (' 
     wmic process 
     where ^(
      name^="cmd.exe" 
      and commandLine like "%%%queue%%%" 
     ^) 
     get ProcessID /value 
    ') do echo %%a 

seulement deux échantillons différents d'échapper à la commande wmic à l'intérieur du for /f.

  • Dans le premier cas, les conditions where sont enveloppées dans des guillemets doubles avec des valeurs en utilisant des guillemets simples. Il n'y a pas besoin de caractères d'échappement car les guillemets le traiteront, mais toutes les conditions doivent être sur la même ligne. Dans le second cas, les conditions where sont entourées de parenthèses avec des valeurs entre guillemets. Certains caractères auront besoin de caractères d'échappement, mais vous avez plus d'options sur la façon d'écrire la commande.

Notez que ces échantillons ont un problème qui probablement ne vous affectera pas: recherche les deux échantillons pour cmd cas, et la commande wmic est démarré dans une instance cmd séparée (la façon dont for /f exécute des commandes), et cette instance correspondra également à la condition (il inclut la même sous-chaîne dans sa propre ligne de commande).

modifié adapter aux commentaires

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "queue=testing" 

    for /f "tokens=2 delims==" %%a in (' 
     wmic process 
     where ^(
      name^="cmd.exe" 
      and commandLine like "%%%queue%%%" 
      and not commandLine like "%%[{%random%%random%%random%}]%%" 
     ^) 
     get ProcessID /value 2^>nul 
    ') do echo %%a 

Pour éviter l'inclusion de l'instance cmd créée par la commande for /f qui détient la commande wmic nous ne devons inclure une condition supplémentaire qui mathématiques cette instance problématique (la condition sera dans la ligne de commande de l'instance cmd) mais cela ne doit pas correspondre à l'instance que nous recherchons.

+0

votre code fonctionne parfaitement. J'ai eu le même mais j'ai oublié la valeur /. fait une différence. Cependant, vous avez raison de dire que la commande wmic a démarré un cmd distinct qui efface. Mais avant qu'il efface il retourne un PID qui affiche par rapport au PID que je cherche. De toute façon pour contourner ça?Je pensais que je pourrais écrire dans le fichier et supprimer le PID errant et faire écho le fichier. –

+0

@DjeliStyles, réponse mise à jour. Voir si cela fonctionne pour vous –

+0

est donc la valeur aléatoire trois valeurs différentes {% valueA %% valueB %% valueC %%} ou la même valeur trois fois? Comme% dirPath %% dirPath %% dirPath% –