Frage Wie erhalte ich einen eigenen Prozess pid von der Eingabeaufforderung in Windows


Ich versuche einen Weg zu finden, meine eigene PID von einer Eingabeaufforderung (für die spätere Verwendung in Bat-Skripten) zu bekommen Bisher war der einzige nützliche Weg, den ich gefunden habe, getpids.exe von hier zu verwenden: http://www.scheibli.com/projects/getpids/index.html aber ich suche nach einem Befehl, der in Windows "eingebaut" ist

edit: Ich suche nach einem "kugelsicheren" Weg - keine Annahmen über meinen Prozess als einzige cmd.exe oder so


22
2018-03-26 05:32


Ursprung


Suchen Sie nach einem Befehlszeilentool, das die PID der CMD.exe anzeigt, in der Sie es ausführen? - uSlackr


Antworten:


Da keine der obigen Lösungen kugelsicher und eingebaut sind, dachte ich mir, dass ich meine kleine Routine hinzufügen würde, die näher am kugelsicheren ist, aber Sie müssen die Ergebnisse irgendwie parsen / speichern

Tun Sie dies, wenn Sie innerhalb der Batch-Datei können

title=mycmd
tasklist /v /fo csv | findstr /i "mycmd"

30
2018-03-26 15:12



das ist wirklich ordentlich. Ich bin ziemlich sicher, dass die aktuelle Zeit + einige zufällig generierte Zahl als der Titel gesetzt werden kann, um in die Nähe von kugelsicher zu kommen - radai
Verwenden Sie% random% +% time% nicht, wenn ein Scheduler Ihr Stapelscript zweimal gleichzeitig aufruft. Ich hatte das Problem, dass das gleiche Skript mit verschiedenen Parametern gleichzeitig aufgerufen wurde. Der Startwert für Zufallszahlen war derselbe und ich stieß beim Erstellen eines temporären Verzeichnisses auf Kollisionen. Es gab keine Möglichkeit, den Fehler beim Erstellen des temporären Verzeichnisses zu behandeln. Lange Rede, kurzer Sinn, wenn Sie davon ausgehen können, dass Ihr Skript nicht zweimal gleichzeitig ausgelöst wird, sollte dieser Trick funktionieren. - Peter Schuetze
Könnte (nicht tief getestet) sein, dass ein genauerer Zeitstempel (einschließlich microseconds, anstatt 1/100 Sekunden wie in% Zeit%), wäre in diesem Fall zuverlässiger: wmic os get LocalDateTime (YearMonthDayHourMinuteSecond.Microsecond + Zeitzone). Es sei denn, der Scheduler kann zwei Dinge genau in der gleichen Mikrosekunde ausführen ... - Gauthier Boaglio
Dies funktioniert nicht, wenn der Prozess in einer anderen Sitzung auf dem Computer ausgeführt wird, da der Titel als "N / A" angezeigt wird - FrinkTheBrave
Dies gibt die PID des Elternprozesses an. - access_granted


Ich glaube, das Folgende ist kugelsicher, vorausgesetzt, der Benutzer hat Zugriff auf WMIC- und TEMP-Punkte auf einen gültigen Pfad, auf dem der Benutzer Schreibrechte hat. Dies ist das Endergebnis einer Zusammenarbeit bei http://www.dostips.com/forum/viewtopic.php?f=3&t=6133.

@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 einfügt. Es kann nur zu einer Kollision kommen, wenn zwei ähnlich benannte Batch-Prozesse versuchen, die PID innerhalb desselben 0,01-Sekunden-Intervalls zu erhalten, in welchem ​​Fall nur einer erfolgreich sein wird.

Jeder fehlgeschlagene Prozess wird wiederholt zurückgeschleift und erneut mit einem neuen Sperrdateipfad versucht, 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 innerhalb eines FOR / F-Befehls ausgeführt, was bedeutet, dass es in einem untergeordneten cmd.exe-Prozess ausgeführt wird. Aus diesem Grund wird die ParentProcessID des Prozesses cmd.exe abgerufen.


6
2017-12-21 12:53



BEARBEITEN: Kleiner Fehler behoben, der Potenzial für Prozent in einem Dateipfad behandelt. Entferne auch nachfolgende Leerzeichen aus dem Ergebnis. - dbenham


Wenn Sie wissen, dass nur eine cmd.exe läuft, können Sie die PID auf folgende Weise erhalten:

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

echo %pid%

5
2018-06-21 06:07



Das funktioniert wirklich gut, danke! - Adambean


Dies sollte den Trick machen:

Aufgabenliste / v


4
2018-03-26 08:16





  1. Windows Task-Manager, müssen Sie zu Ansicht -> Spalten auswählen .. und wählen Sie PID.
  2. "tasklist / v", um ausführliche Aufgabeninformationen in der Eingabeaufforderung zu erhalten.
  3. Process Explorer von live.sinternals.com.

4
2018-03-26 08:39



@ Vivek, von einer Eingabeaufforderung ... und du täuschst Antworten - WooYek
Ich gab nur alle möglichen Optionen .. und keine Duplizierung .. Ich hätte auch PowerShell erwähnt haben, aber ich habe mich zurückgehalten, da das nicht standardmäßig in XP und 2003 kommt. Wenn dies für Vista OS ist, wäre Yes PowerShell meine Präferenz gewesen . - Vivek Kumbhar


Erweitern Sie Tony Roths Antwort:

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

Wenn Sie den WINDOWTITLE-Filter verwenden, vermeiden Sie die Pipe, sodass Sie sie in eine for-Schleife einfügen und sie einer Variablen mit SET 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

Das Entfernen von / v macht es schneller und die / NH wird die Kopfzeile los. Sie benötigen den Platzhalter nach "uniqueTitle", da der Fenstertitel den aktuellen Befehl enthält (er würde also immer weiter laufen, wenn Sie ihn vollständig abgleichen wollten).


4
2017-12-07 13:07





Wenn Sie die PID von Bildname "notepad.exe" finden möchten, dann wird der folgende Code für Sie funktionieren:

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

3
2018-06-17 08:53





Wenn Sie das Windows 2003 Resource Kit haben, drücken Sie es durch qgrep, um die gewünschte Zeile zu erhalten. Du könntest dann die PID von hier aus extrahieren (das setzt voraus, dass du nur einen cmd gleichzeitig hast),

tasklist /v | qgrep cmd

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

2
2018-03-26 08:47





Verwenden von PowerShell + WMI:

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

2
2017-09-20 00:02