próbuję znaleźć sposób na uzyskanie własnego PID z wiersza polecenia (do późniejszego użycia w skryptach nietoperzy) do tej pory jedynym przydatnym sposobem, jaki znalazłem, było użycie getpids.exe tutaj: http://www.scheibli.com/ projects / getpids / index.html, ale szukam polecenia „wbudowanego” w Windows
edit: szukam "kuloodpornego" sposobu - nie zakładam, że mój proces jest jedynym cmd.exe lub czymkolwiek
microseconds
, zamiast 1/100 sekund jak w% time%), byłoby bardziej niezawodne w tym przypadku:wmic os get LocalDateTime
(YearMonthDayHourMinuteSecond.Microsecond + Strefa czasowa). Chyba że planista jest w stanie uruchomić dwie rzeczy w dokładnie tej samej mikrosekundie ...Uważam, że poniższe informacje są kuloodporne, pod warunkiem, że użytkownik ma dostęp do WMIC i TEMP wskazuje prawidłową ścieżkę, w której użytkownik ma uprawnienia do zapisu. Jest to wynik końcowy wspólnej pracy pod adresem http://www.dostips.com/forum/viewtopic.php?f=3&t=6133 .
Skrypt ustanawia wyłączną blokadę pliku tymczasowego, który uwzględnia aktualny czas w nazwie. Kolizja może nastąpić tylko wtedy, gdy dwa podobnie nazwane procesy wsadowe spróbują uzyskać PID w tym samym przedziale czasowym 0,01 sekundy, w którym to przypadku tylko jeden się powiedzie.
Każdy proces, który się nie powiedzie, będzie wielokrotnie zapętlać i próbować ponownie z nową ścieżką do pliku blokady, dopóki się nie powiedzie.
Pełna ścieżka do pliku blokady jest przekształcana w unikalny identyfikator, którego można użyć w zapytaniu WMIC. WMIC jest uruchamiany w poleceniu FOR / F, co oznacza, że działa w potomnym procesie cmd.exe. Dlatego pobierany jest ParentProcessID procesu cmd.exe.
źródło
Rozwijając odpowiedź Tony'ego Rotha:
Użycie filtra WINDOWTITLE pozwala uniknąć potoku, dzięki czemu można umieścić go w pętli for i przypisać do zmiennej za pomocą SET, jeśli chcesz:
Usunięcie
/v
powoduje, że jest szybszy, a/NH
pozbywa się linii nagłówka. Potrzebny będzie symbol wieloznaczny po,"uniqueTitle"
ponieważ tytuł okna faktycznie zawiera bieżące polecenie (a więc będzie się wyświetlać i włączać, jeśli spróbujesz go w pełni dopasować).źródło
Korzystanie z PowerShell + WMI:
źródło
pwsh -noprofile -c "(Get-Process -Id $PID).Parent.Id"
źródło
jeśli wiesz, że działa tylko jeden plik cmd.exe, możesz uzyskać PID w ten sposób:
źródło
To powinno załatwić sprawę:
źródło
Jeśli chcesz znaleźć PID imagename „notepad.exe”, następujący kod będzie dla Ciebie działał:
źródło
Jeśli masz zestaw Windows 2003 Resource Kit, przepchnij go przez qgrep, aby uzyskać żądaną linię. Następnie możesz wyodrębnić pid stąd (zakłada to, że masz tylko jeden cmd na raz),
źródło
Spójrz na tę małą sztuczkę partii . Ustawia tytuł cmd na specjalną wartość, a następnie używa tasklist, aby go znaleźć. Wynalazczy
\\ Greg
źródło
TO KRÓTKI SPOSÓB UZYSKANIA ID PROCESU DLA OPEN CMD
źródło
Ta odpowiedź da TYLKO identyfikator procesu i żadna z dodatkowych rzeczy, które zawiera najlepsza odpowiedź.
Wyjaśnienie:
- nie będzie PID dla cmd.exe, który jest większy niż 18100, więc sprawdź, czy PID2 jest większy niż 8100, więc wiemy, czy jest to 4 lub 5 cyfr
przypadek 1: 5-cyfrowy PID jak 17504 ma PID1 val 17504 i PID2 val 1750, więc używamy PID1
przypadek 2: 4-cyfrowy PID jak 8205 ma wartość PID1 8205 "i wartość PID2 8205, więc używamy PID2
przypadek 3: 4-cyfrowy PID jak 4352 ma wartość PID1 4352 "i wartość PID2 4352, więc używamy PID2
źródło