web-dev-qa-db-fra.com

Comment obtenir son propre pid de processus à partir de l'invite de commandes dans Windows

J'essaie de trouver un moyen d'obtenir mon propre PID à partir d'une invite de commande (pour une utilisation ultérieure dans les scripts bat).

Jusqu'à présent, le seul moyen utile que j'ai trouvé était d'utiliser getpids.exe d'ici: http://www.scheibli.com/projects/getpids/index.html , mais je recherche une commande "intégrée" à Windows.

Je cherche un moyen "pare-balles". Aucune hypothèse sur mon processus étant le seul cmd.exe ou quoi que ce soit.

27
radai

Étant donné qu'aucune des autres solutions n'est à l'épreuve des balles et intégrée, j'ai pensé proposer la solution suivante, mais notez que vous devrez analyser/enregistrer les résultats d'une manière ou d'une autre:

title mycmd
tasklist /v /fo csv | findstr /i "mycmd"
39
tony roth

Utilisation de PowerShell + WMI:

powershell (Get-WmiObject Win32_Process -Filter ProcessId=$PID).ParentProcessId
7
Nicolas Melay

Développant la réponse de Tony Roth:

title uniqueTitle
for /f "tokens=2 USEBACKQ" %f IN (`tasklist /NH /FI "WINDOWTITLE eq uniqueTitle*"`) Do echo %f

L'utilisation du filtre WINDOWTITLE évite le tuyau, vous pouvez donc le placer dans une boucle for et l'affecter à une variable avec SET si vous le souhaitez:

title uniqueTitle
for /f "tokens=2 USEBACKQ" %f IN (`tasklist /NH /FI "WINDOWTITLE eq uniqueTitle*"`) Do set ourPID=%f

Suppression du /v le rend plus rapide, et le /NH supprime la ligne d'en-tête. Vous avez besoin du caractère générique après "uniqueTitle" parce que le titre de la fenêtre contient en fait la commande actuelle (donc elle continuerait si vous essayiez de la faire correspondre complètement).

7
David

Je crois que ce qui suit est à l'épreuve des balles, à condition que l'utilisateur ait accès aux points WMIC et TEMP vers un chemin valide où l'utilisateur a des privilèges d'écriture. Ceci est le résultat final d'un travail collaboratif chez http://www.dostips.com/forum/viewtopic.php?f=3&t=61 .

@echo off

:getPID  [RtnVar]
::
:: Store the Process ID (PID) of the currently running script in environment variable RtnVar.
:: If called without any argument, then simply write the PID to stdout.
::
setlocal disableDelayedExpansion
:getLock
set "lock=%temp%\%~nx0.%time::=.%.lock"
set "uid=%lock:\=:b%"
set "uid=%uid:,=:c%"
set "uid=%uid:'=:q%"
set "uid=%uid:_=:u%"
setlocal enableDelayedExpansion
set "uid=!uid:%%=:p!"
endlocal & set "uid=%uid%"
2>nul ( 9>"%lock%" (
  for /f "skip=1" %%A in (
    'wmic process where "name='cmd.exe' and CommandLine like '%%<%uid%>%%'" get ParentProcessID'
  ) do for %%B in (%%A) do set "PID=%%B"
  (call )
))||goto :getLock
del "%lock%" 2>nul
endlocal & if "%~1" equ "" (echo(%PID%) else set "%~1=%PID%"
exit /b

Le script établit un verrou exclusif sur un fichier temporaire qui incorpore l'heure actuelle dans le nom. Il ne peut y avoir collision que si deux processus par lots nommés similaires tentent d'obtenir le PID dans le même intervalle de temps de 0,01 seconde, auquel cas un seul réussira.

Tout processus qui échoue sera bouclé à plusieurs reprises et réessayera avec un nouveau chemin de fichier de verrouillage jusqu'à ce qu'il réussisse.

Le chemin d'accès complet au fichier de verrouillage est transformé en un ID unique qui peut être utilisé dans la requête WMIC. WMIC est exécuté dans une commande FOR/F, ce qui signifie qu'il s'exécute dans un processus enfant cmd.exe. C'est pourquoi le ParentProcessID du processus cmd.exe est récupéré.

7
dbenham

si vous savez qu'il n'y a qu'un seul cmd.exe en cours d'exécution, vous pouvez obtenir le PID de cette façon:

for /F "tokens=1,2" %%i in ('tasklist /FI "IMAGENAME eq cmd.exe" /fo table /nh') do set pid=%%j

echo %pid%
5
zumalifeguard
  1. Windows Task Manager, vous devrez aller dans Affichage -> Sélectionner les colonnes .. et sélectionner PID.
  2. "tasklist/v" pour obtenir des informations détaillées sur les tâches dans l'invite de commande.
  3. Explorateur de processus à partir de live.sysinternals.com .
5
Vivek Kumbhar

Cela devrait faire l'affaire:

liste des tâches/v

4
WooYek

Si vous souhaitez trouver le PID du nom d'imagerie "notepad.exe", le code suivant fonctionnera pour vous:

for /F "tokens=1,2" %i in ('tasklist') do (
 if "%i" equ "notepad.exe" (set x=%j)
)
echo %x%
3
Minchurl

Si vous avez le kit de ressources Windows 2003 Poussez-le dans qgrep pour obtenir uniquement la ligne souhaitée. Vous pouvez ensuite extraire le pid d'ici (cela suppose que vous n'avez qu'un seul cmd en cours d'exécution à la fois),

tasklist /v | qgrep cmd

cmd.exe 2040 RDP-Tcp#447 0 1,804 K Running MACHINE\Administrator  0:00:00 Command Prompt
2
Guppy

Jetez un oeil à ce petite astuce batch . Il définit le titre de cmd sur une valeur spéciale puis utilise la liste des tâches pour le trouver. Inventif

\\ Greg

1
uSlackr

vous pouvez essayer avec getcmdPid.bat - ceci est une application .net auto-compilée incorporée dans un script bat et renvoie le PID comme niveau d'erreur:

call getcmdPid
echo %errorlevel%
0
npocmaka

CECI IS COURTE FAÇON D'OBTENIR UN ID DE PROCESSUS POUR UN CMD OUVERT

tasklist /v /fi "imagename EQ cmd.exe" /FO LIST | FIND "PID:"
0
hollopost

Cette réponse vous donnera UNIQUEMENT l'ID du processus, et aucun des éléments supplémentaires inclus dans la réponse du haut.

title mycmd
tasklist /v /fo csv | findstr /i "mycmd" > PIDinfo.txt

set /p PIDinfo=<PIDinfo.txt
set PID1=%PIDinfo:~11,5%
set PID2=%PIDinfo:~11,4%

if %PID2% gtr 8100 (
    set PID=%PID2%
) else (
    set PID=%PID1%
)

echo %PID%

Explication:

-il n'y aura pas de PID pour cmd.exe supérieur à 18100, donc vérifiez si PID2 est supérieur à 8100 afin que nous sachions s'il s'agit d'un nombre à 4 ou 5 chiffres

cas 1: un PID à 5 chiffres comme 17504 a un PID1 val 17504 et un PID2 val de 1750, nous utilisons donc PID1

cas 2: un PID à 4 chiffres comme 8205 a une valeur PID1 de 8205 "et une valeur PID2 de 8205, nous utilisons donc PID2

cas 3: un PID à 4 chiffres comme 4352 a une valeur PID1 de 4352 "et une valeur PID2 de 4352, nous utilisons donc PID2

0
Collin Fox