it-swarm.com.de

So erhalten Sie eine eigene Prozess-PID über den Befehl Eingabeaufforderung in Windows

Ich versuche, eine Möglichkeit zu finden, meine eigene PID über eine Eingabeaufforderung abzurufen (zur späteren Verwendung in Bat-Skripten).

Bisher war der einzige nützliche Weg, den ich gefunden habe, getpids.exe Von hier aus zu verwenden: http://www.scheibli.com/projects/getpids/index.html , aber ich suche für einen Befehl, der in Windows "eingebaut" ist.

Ich suche einen "kugelsicheren" Weg. Keine Annahmen darüber, dass mein Prozess die einzige cmd.exe oder so ist.

27
radai

Da keine der anderen Lösungen kugelsicher und integriert ist, dachte ich, ich würde die folgende Lösung anbieten, aber beachten Sie, dass Sie die Ergebnisse irgendwie analysieren/speichern müssen:

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

Verwenden von PowerShell + WMI:

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

Tony Roths Antwort erweitern:

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

Wenn Sie den Filter WINDOWTITLE verwenden, wird die Pipe vermieden, sodass Sie sie in eine for-Schleife einfügen und mit SET einer Variablen zuweisen können, wenn Sie möchten:

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

Entferne den /v macht es schneller und das /NH entfernt die Kopfzeile. Sie benötigen den Platzhalter nach "uniqueTitle" weil der Fenstertitel tatsächlich den aktuellen Befehl enthält (daher würde er immer weitergehen, wenn Sie versuchen würden, ihn vollständig abzugleichen).

7
David

Ich glaube, das Folgende ist kugelsicher, vorausgesetzt, der Benutzer hat Zugriff auf WMIC und TEMP verweist auf einen gültigen Pfad, in dem der Benutzer über Schreibrechte verfügt. Dies ist das Endergebnis einer Zusammenarbeit unter 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

Das Skript richtet eine exklusive Sperre für eine temporäre Datei ein, die die aktuelle Uhrzeit in den Namen einbezieht. Es kann nur zu einer Kollision kommen, wenn zwei gleichnamige Stapelprozesse versuchen, die PID innerhalb desselben Zeitintervalls von 0,01 Sekunden zu erhalten. In diesem Fall ist nur einer erfolgreich.

Jeder fehlgeschlagene Prozess wiederholt sich wiederholt und versucht es erneut mit einem neuen Sperrdateipfad, bis er erfolgreich ist.

Der vollständige Pfad zur Sperrdatei wird in eine eindeutige ID umgewandelt, die in der WMIC-Abfrage verwendet werden kann. WMIC wird in einem FOR/F-Befehl ausgeführt, dh, es wird in einem untergeordneten cmd.exe-Prozess ausgeführt. Aus diesem Grund wird die ParentProcessID des Prozesses cmd.exe abgerufen.

7
dbenham

wenn Sie wissen, dass nur eine cmd.exe ausgeführt wird, können Sie die PID folgendermaßen ermitteln:

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. Im Windows Task-Manager müssen Sie zu Ansicht -> Spalten auswählen .. gehen und PID auswählen.
  2. "tasklist/v", um ausführliche Aufgabeninformationen in der Eingabeaufforderung abzurufen.
  3. Prozess-Explorer von live.sysinternals.com .
5
Vivek Kumbhar

Dies sollte den Trick tun:

aufgabenliste/v

4
WooYek

Wenn Sie die PID des Bildnamens "notepad.exe" ermitteln möchten, funktioniert der folgende Code für Sie:

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

Wenn Sie das Windows 2003 Resource Kit haben Schieben Sie es durch qgrep, um genau die gewünschte Zeile zu erhalten. Sie können dann die PID von hier extrahieren (dies setzt voraus, dass jeweils nur ein Cmd ausgeführt wird).

tasklist /v | qgrep cmd

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

Schauen Sie sich das an kleiner Batch-Trick . Es setzt den Titel von cmd auf einen speziellen Wert und verwendet dann die Aufgabenliste, um ihn zu finden. Erfinderisch

\\ Greg

1
uSlackr

sie können es mit getcmdPid.bat versuchen. Dies ist eine selbstkompilierte .net-Anwendung, die in ein Bat-Skript eingebettet ist und die PID als Fehlerstufe zurückgibt:

call getcmdPid
echo %errorlevel%
0
npocmaka

DIESES IS KURZER WEG, UM DIE PROZESS-ID FÜR OFFENES CMD ZU ERHALTEN

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

Diese Antwort gibt Ihnen NUR die Prozess-ID und keines der zusätzlichen Dinge, die die Top-Antwort enthält.

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%

Erläuterung:

-Es gibt keine PID für cmd.exe, die größer als 18100 ist. Überprüfen Sie daher, ob PID2 größer als 8100 ist, damit wir wissen, ob es sich um eine 4-stellige oder 5-stellige Zahl handelt

fall 1: Eine 5-stellige PID wie 17504 hat einen PID1-Wert 17504 und einen PID2-Wert 1750, daher verwenden wir PID1

fall 2: Eine 4-stellige PID wie 8205 hat einen PID1-Wert von 8205 "und einen PID2-Wert von 8205, daher verwenden wir PID2

fall 3: Eine 4-stellige PID wie 4352 hat einen PID1-Wert von 4352 "und einen PID2-Wert von 4352, daher verwenden wir PID2

0
Collin Fox