Jak rozpoznać, który proces „explorer.exe” jest najważniejszy?

13

Mam plik wsadowy, który zmienia kilka plików rejestru, a następnie ponownie uruchamia explorer.exe, aby zadziałały. Używam poleceń

taskkill /f /im explorer.exe
explorer.exe

To oczywiście zabija wszystkie procesy explorer.exe, w tym otwarte okna eksploratora. (Oczywiście używam tej opcji Launch folder windows in a separate process.)

Czy jest jakiś sposób, aby określić, która instancja explorer.exe jest główna, i po prostu ją zabić?

Hod - Armia Moniki
źródło
Zabicie głównego explorer.exe prawdopodobnie zabije wszystkie pozostałe, ponieważ są one zależne od uruchomienia.
cutrightjm
1
@ ekaj Nie ma. Jestem w stanie to zrobić ręcznie. Każde okno jest niezależnym procesem.
Hod - Armia Moniki
Interesuje mnie również znalezienie wiarygodnego sposobu określenia podstawowej (powiązanej z Desktop) explorer.exeinstancji, ale z przeciwnego powodu. Uważam za denerwujące, że odradzane explorer.exeprocesy nie zawsze kończą się, gdy wszystkie powiązane okna są zamknięte. Używam Menedżera zadań do ich zabijania i zwykle polegam na tym, że odradzane instancje mają zwykle wysoki priorytet (z jakiegoś powodu). Działa to dobrze, ale jeśli zdarzy się, że ustawiłem go na normalny (z oczywistych powodów), ryzykuję przypadkowe zabicie pierwotnego procesu.
Synetech,
@ Synetech Rozwiązaniem tego jest taskkill /f /im explorer.exe /fi "windowtitle ne N/A". Z jakiegoś powodu kopiowanie / wklejanie tego do monitu cmd nie działa; musisz wpisać go ręcznie. Nie próbowałem pliku wsadowego.
Hod - Armia Moniki
1
Problem podzieliłeś na część łatwą i niemożliwą, rozwiązałeś część łatwą i teraz prosisz o pomoc w części niemożliwej. Jest całkiem prawdopodobne, że „łatwa” część rozwiązania nie jest poprawna (np. To, co próbujesz zrobić, można osiągnąć za pomocą zasad grupy), więc dobrze by było, gdyby twoje pytanie zawierało pierwotny problem, który próbujesz rozwiązać . Procesy zabijania, które nie należą do ciebie, rzadko są poprawne.
Simon Richter

Odpowiedzi:

9

Podejście oparte na tytule okna

@ techie007 zasugerował zabicie explorer.exetytułu okna N/A.

Komenda

for /f "tokens=2,10" %%p in ('tasklist /nh /v /fi "imagename eq explorer.exe"') do if "%%q"=="N/A" taskkill /f /pid %%p

Jak to działa

  • tasklist /nh /v /fi "imagename eq explorer.exe"wyczerpująco wymienia wszystkie procesy z nazwą obrazu explorer.exe.

  • for /f "tokens=2,10" %%p in ('COMMAND1') do COMMAND2

    Wykonuje COMMAND1. Dla każdego wiersza wyniku ustawia zmienne %%poraz %%qdrugi i dziesiąty „token” (rozdzielone spacją) i wykonuje COMMAND2.

    W przypadku taskkill /v, %%p teraz posiada PID i %%q(początek) tytuł okna.

  • if "%%q"=="N/A" taskkill /f /pid %%psprawdza, czy tytuł okna to N/A.

    Jeśli tak, kończy proces za pomocą taskkill.

Podejście oparte na użyciu pamięci

@Syntech wskazał, że jest to niewiarygodne w Eksploratorze Windows, ale w programach główny proces zawsze ma najwyższe wykorzystanie pamięci.

Komenda

for /f "tokens=2" %%p in ('tasklist /nh /fi "imagename eq explorer.exe" ^| sort /+65') do @set explorerpid=%%p
taskkill /f /pid %explorerpid%

Jak to działa

  • tasklist /nh /fi "imagename eq explorer.exe"wyświetla wszystkie procesy z nazwą obrazu explorer.exe.

  • sort /+65 sortuje poprzednie dane wyjściowe, zaczynając od 65. znaku (gdzie zaczyna się użycie pamięci).

  • for /f "tokens=2" %%p in ('COMMAND') do @set explorerpid=%%pustawia explorerpidna drugie tokens=2wejście ( ) oddzielone spacjami - każdego wiersza wyjścia COMMAND, który jest odpowiednim PID.

  • Ponieważ tasklistwyjście zostało posortowane, explorerpidprzechowuje deklarowany PID i taskkillkończy proces.

Dennis
źródło
Dziękuję Ci! Ale z jakiegoś powodu to jeszcze nie działa. Pracuję, aby sprawdzić, czy mogę go jakoś zmodyfikować, aby działał.
Hod - Armia Moniki
1
@Dennis, > aby ustawić explorerpid na PID explorer.exe przy najwyższym zużyciu pamięci. To powinien być najbardziej niezawodny sposób na określenie głównego procesu. Nie, nieprawda. Otwórz nowy proces okna (np. Za pomocą skrótu) i przejdź do folderu z dużą ilością zdjęć i wyświetl je w trybie miniatur. Nowy proces szybko wyprzedzi pierwotny pod względem zużycia pamięci. > Cóż, nie wspomniałeś, że nie używasz domyślnej konfiguracji. Pytanie brzmi: skąd mam wiedzieć, który proces „explorer.exe” jest najważniejszy? Jak myślisz, jak inaczej może to stanowić problem?
Synetech,
Teraz działa zarówno podejście okienkowe, jak i pamięć. Myślę, że pójdę z oknem - wydaje się bardziej niezawodny. Dziękuję bardzo!
Hod - Armia Moniki
3

Być może możesz powiedzieć Eksploratorowi, aby pokazał ścieżkę na pasku tytułu, a następnie użyć WINDOWTITLEfiltru, aby zabić go na tej podstawie?

  • Otwórz Eksploratora
  • naciśnij Alt
  • Kliknij „Narzędzia (pozycja menu)”
  • Kliknij „Opcje folderów ... (pozycja menu)”
  • Kliknij „Widok (karta strony)” w „Opcjach folderów”
  • Kliknij, aby zaznaczyć „Wyświetl pełną ścieżkę na pasku tytułu (tylko klasyczny motyw)” w „Opcjach folderów”
  • Kliknij „Zastosuj” -> „OK”

Ścieżka nie będzie wyświetlana na pasku tytułowym Eksploratora z „nieklasycznymi” motywami, ale jest (teraz); to po prostu nie jest widoczne.

taskkill /F /FI "WINDOWTITLE eq C:\PathToThing\RunningInExplorer\ToRestart*"

Może być konieczne tymczasowe przejście do klasycznego motywu, aby określić ścieżkę / tytuł dla wystąpienia Eksploratora, który chcesz zrestartować.

Nie w 100% głupi, ale każde okno Eksploratora, które nie ma (częściowej) ścieżki w tytule, byłoby przynajmniej bezpieczne. :)

edytować:

Ponieważ chcesz pobrać ten z tytułem „N / A”, prawdopodobnie będziesz musiał użyć pliku wsadowego, abyś mógł tokenizować wyniki TASKLISTY i użyć tych wyników tokenów do użycia TASKKIL do zabicia przez PID.

Znalazłem odpowiedź na StackOverflow.com, która rozwiązuje ten problem:

Z pytania Zadaj zabić proces bez tytułu? to ta odpowiedź, która zawiera przykładowy plik wsadowy:

@echo off
SETLOCAL enabledelayedexpansion
for /f "tokens=*" %%a in ('TASKLIST /V') do (
  set s=%%a
  set p=!s:~27,5!
  set t=!s:~152,3!
  if '!t!'=='N/A' ECHO TASKKILL /PID !p! /T
)

Będziesz chciał zmienić polecenie „TASKLIST / V”, aby było bardziej specyficzne dla Explorer.exe i tak dalej, ale powinno dać ci dobry punkt wyjścia.

Ƭᴇcʜιᴇ007
źródło
Proces, który chcę zabić, jest najważniejszy. tasklist /fi "imagename eq explorer.exe" /v /fo listmówi mi, że jego tytuł okna to „N / A”. Niestety, „„ windowtitle eq N / A ”nie działa. Jakieś pomysły?
Hod - Armia Moniki
Ahhhhhh. gotcha. Znalazłem odpowiedź na StackOverflow, zaktualizuję odpowiedź odpowiednimi bitami tutaj za pomocą linku.
Ƭᴇcʜιᴇ007
Nadal nie rozumiem, jak to by działało. Co jeśli nie ma otwartych okien Eksploratora innych niż pulpit?
Synetech,
1

Zabij proces z najniższym PID (ID procesu). Najpierw zostałby uruchomiony, ponieważ procesy są kolejno numerowane.

Mitrylowe
źródło
+1 To działałoby po raz pierwszy plik wsadowy, ale ponieważ ponownie uruchomiono explorer.exe, nowy „główny” proces będzie miał wyższy PID. Czy jest inny sposób?
Hod - Armia Moniki
To prawda. Jednak możesz po prostu wyprowadzić dane tasklist | find /f "explorer"i zapytać, a następnie zapytać (z danymi użytkownika), jaki jest najniższy PID do zabicia.
Mythrillic
@HodofHod: Najbardziej niezawodnym sposobem byłoby wybranie procesu o najwyższym zużyciu pamięci. Jeśli możesz użyć MinGW ( sed, awkitp.), To dość łatwe do zrobienia automatycznie. Jeśli nie, dane wejściowe użytkownika mogą być najlepszym wyborem.
Dennis
@ Adam543i, > Zabij proces z najniższym PID (ID procesu). Najpierw zostałby uruchomiony, ponieważ procesy są kolejno numerowane. O jakiej wersji systemu Windows mówisz? To po prostu nieprawda. Oprócz losowej funkcji bezpieczeństwa PID, przypominam sobie coś na OldNewThing o przypisywaniu PID w odstępach czasowych (czterech lub 16 lub coś takiego). Faktem jest, że stosowanie PID (nawet względnych) jest po prostu zbyt zawodne.
Synetech,
@Dennis, > Najbardziej niezawodnym sposobem byłoby wybranie procesu o najwyższym zużyciu pamięci. Nie. Ani trochę. Proces spawnowania ma większe wykorzystanie pamięci.
Synetech,