Ich versuche, einen Weg zu finden, um meine eigene PID von einer Eingabeaufforderung (für die spätere Verwendung in Fledermaus-Skripten) zu erhalten. Bisher war der einzige nützliche Weg, den ich fand, getpids.exe von hier aus zu verwenden: http://www.scheibli.com/ projects / getpids / index.html aber ich suche nach einem Befehl, der in Windows "eingebaut" ist
edit: ich bin auf der Suche nach einem "kugelsicheren" Weg - keine Vermutungen, dass mein Prozess die einzige cmd.exe ist oder so
microseconds
in diesem Fall zuverlässiger , einen genaueren Zeitstempel (einschließlich 1/100 Sekunden wie in% time%) zu erhalten (nicht eingehend getestet) :wmic os get LocalDateTime
(YearMonthDayHourMinuteSecond.Microsecond + Timezone). Es sei denn, der Scheduler kann zwei Dinge in genau derselben MikrosekundeIch 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=6133 .
Das Skript richtet eine exklusive Sperre für eine temporäre Datei ein, die die aktuelle Uhrzeit in den Namen einbezieht. Es kann nur dann zu einer Kollision kommen, wenn zwei gleichnamige Batch-Prozesse versuchen, die PID innerhalb desselben Zeitintervalls von 0,01 Sekunden zu ermitteln. In diesem Fall ist nur einer erfolgreich.
Jeder fehlgeschlagene Prozess wird wiederholt 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. Dies bedeutet, dass es in einem untergeordneten cmd.exe-Prozess ausgeführt wird. Aus diesem Grund wird die ParentProcessID des Prozesses cmd.exe abgerufen.
quelle
Erweitere Tony Roths Antwort:
Mit dem WINDOWTITLE-Filter wird die Pipe umgangen, sodass Sie sie in eine for-Schleife einfügen und mit SET einer Variablen zuweisen können, wenn Sie möchten:
Durch Entfernen von
/v
wird es schneller und/NH
die Kopfzeile wird entfernt. Sie benötigen den Platzhalter danach,"uniqueTitle"
da der Fenstertitel tatsächlich den aktuellen Befehl enthält (er würde also immer weitergehen, wenn Sie versuchen würden, ihn vollständig abzugleichen).quelle
Verwenden von PowerShell + WMI:
quelle
pwsh -noprofile -c "(Get-Process -Id $PID).Parent.Id"
quelle
Wenn Sie wissen, dass nur eine cmd.exe ausgeführt wird, können Sie die PID folgendermaßen ermitteln:
quelle
Dies sollte den Trick machen:
quelle
Wenn Sie die PID des Bildnamens "notepad.exe" ermitteln möchten, funktioniert der folgende Code für Sie:
quelle
Wenn Sie das Windows 2003 Resource Kit haben, drücken Sie es durch qgrep, um genau die Zeile zu erhalten, die Sie möchten. Sie könnten dann die pid von hier extrahieren (dies setzt voraus, dass Sie nur einen cmd auf einmal ausgeführt haben),
quelle
Schauen Sie sich diesen kleinen Trick an . Es setzt den Titel von cmd auf einen speziellen Wert und verwendet dann die Jobliste, um ihn zu finden. Erfinderisch
Greg
quelle
DIES IST KURZER WEG, UM DIE PROZESS-ID FÜR OFFENES CMD ZU ERHALTEN
quelle
Diese Antwort enthält NUR die Prozess-ID und keine zusätzlichen Informationen, die in der oberen Antwort enthalten sind.
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 eine 5-stellige Zahl handelt
Fall 1: Eine 5-stellige PID wie 17504 hat einen PID1-Wert von 17504 und einen PID2-Wert von 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
quelle