Як я можу сказати, який саме "explorer.exe" процес є основним?


13

У мене є пакетний файл, який змінює кілька файлів реєстру, а потім перезавантажує explor.exe, щоб вони набули чинності. Я використовую команди

taskkill /f /im explorer.exe
explorer.exe

Це, звичайно, вбиває всі процеси Explor.exe, включаючи відкриті у мене вікна Explorer. (Очевидно, я використовую варіант для Launch folder windows in a separate process.)

Чи є якийсь спосіб я визначити, який екземпляр explor.exe є основним, і просто вбити це?


Вбивство головного Explor.exe, ймовірно, просто вб'є всіх інших, оскільки вони залежать від його запуску.
cutrightjm

1
@ekaj Це не так. Я вмію це робити вручну. Кожне вікно - це самостійний процес.
Ход - Армія Моніки

Мені цікаво знайти надійний спосіб визначення основного (пов'язаного з Desktop) explorer.exeекземпляра, але з протилежної причини. Мені прикро, що породжені explorer.exeпроцеси не завжди існують, коли всі пов'язані з ними вікна закриваються. Я використовую диспетчер завдань, щоб знищити їх, і, як правило, покладаюся на те, що породжені екземпляри зазвичай встановлені з високим пріоритетом (чомусь). Це працює чудово, але якщо я, звичайно, встановив це нормально (з очевидних причин), то ризикую випадково вбити основний процес.
Synetech

@Synetech Рішенням цього є taskkill /f /im explorer.exe /fi "windowtitle ne N/A". Чомусь копіювати / вставляти в підказку cmd не працює; ви повинні ввести його вручну. Не спробував пакетний файл.
Ход - Армія Моніки

1
Ви розділили проблему на легку і неможливу частину, вирішили легку частину і тепер просите про допомогу з неможливою частиною. Цілком ймовірно, що "легка" частина рішення не є правильною (наприклад, те, що ви намагаєтеся зробити, можна було б досягти за допомогою групової політики), тому було б добре, якби ваше запитання включало оригінальну проблему, яку ви намагаєтеся вирішити. . Процеси вбивства, які не належать вам, рідко є правильним.
Саймон Ріхтер

Відповіді:


9

Підхід, заснований на заголовку вікна

@ techie007 запропонував убити назву explorer.exeвікна N/A.

Командування

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

Як це працює

  • tasklist /nh /v /fi "imagename eq explorer.exe"Докладно перераховує всі процеси з назвою зображення explorer.exe.

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

    виконує COMMAND1. Для кожного рядка виводу він встановлює змінні, %%pа %%qдругий і десятий "маркер" (розділений пробілом) і виконує COMMAND2.

    У випадку з taskkill /v, %%p тепер утримує PID та %%q(початок) заголовок вікна.

  • if "%%q"=="N/A" taskkill /f /pid %%pперевіряє, чи є заголовок вікна N/A.

    Якщо так, він припиняє процес за допомогою taskkill.

Підхід, заснований на використанні пам'яті

@Syntech вказував, що це не є надійним для Провідника Windows, але в програмах основний процес завжди має найбільше використання пам'яті.

Командування

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

Як це працює

  • tasklist /nh /fi "imagename eq explorer.exe"перераховує всі процеси з назвою зображення explorer.exe.

  • sort /+65 сортує попередній вихід, починаючи з 65-го символу (там, де починається використання пам’яті).

  • for /f "tokens=2" %%p in ('COMMAND') do @set explorerpid=%%pвстановлює explorerpidдругий ( tokens=2) вхід - розділений пробілами - кожного рядка виводу COMMAND, що є відповідним PID.

  • Оскільки tasklist'suput відсортовано, explorerpidзберігає заявлений PID та taskkillприпиняє процес.


Дякую! Але чомусь це для мене ще не працює. Я працюю над тим, чи зможу я якось модифікувати його, щоб змусити його працювати.
Ход - Армія Моніки

1
@Dennis, > щоб встановити explorerpid для PID Explorerr.exe з найвищим обсягом використання пам'яті. Це має бути найбільш надійним способом визначення основного процесу. Ні неправильно. Відкрийте новий процес вікна (наприклад, за допомогою ярлика) та перейдіть до папки з великою кількістю зображень та перегляньте їх у режимі мініатюр. Новий процес швидко обійде оригінальний у використанні пам'яті. > Ну, ви не згадали, що не використовуєте конфігурацію за замовчуванням. Питання полягає в тому, як я можу сказати, який процес "explorer.exe" є основним? Як ви вважаєте, як це може бути проблемою?
Synetech

Зараз працює і віконний підхід, і підхід пам'яті. Я думаю, що піду з віконцем - здається, надійніше. Дуже дякую!
Ход - Армія Моніки

3

Можливо, ви можете сказати Провідникові показати шлях у рядку заголовка, а потім використати WINDOWTITLEфільтр, щоб знищити його на основі цього?

  • Відкрийте Провідник
  • Натисніть Alt
  • Клацніть на "Інструменти (пункт меню)"
  • Клацніть на "Параметри папки ... (пункт меню)"
  • Клацніть на "Перегляд (вкладка сторінки)" у "Параметри папок"
  • Клацніть, щоб вибрати "Показувати повний шлях у рядку заголовка (лише класична тема)" у "Параметри папок"
  • Натисніть "Застосувати" -> "ОК"

Шлях не відображатиметься в заголовку рядка Провідника з "некласичними" темами, але він є (зараз) там; це просто не видно

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

Вам може знадобитися тимчасово перейти на класичну тему, щоб визначити, який шлях / заголовок для екземпляра Провідника, який ви хочете перезапустити.

Не на 100% дурня, але будь-які вікна Провідника, у яких немає цього (часткового) шляху в заголовку, було б принаймні безпечним. :)

редагувати:

Оскільки ви хочете схопити той із заголовком "N / A", вам, ймовірно, доведеться використовувати пакетний файл, щоб ви могли токенізувати результати TASKLIST та використовувати ці результати лексеми, щоб використовувати TASKKIL для вбивства PID.

Я знайшов відповідь на StackOverflow.com, який вирішує цю проблему:

З питання Taskkill процес без назви? є така відповідь , який включає в себе цей приклад пакетного файлу:

@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
)

Ви хочете змінити команду "TASKLIST / V", щоб вона була більш специфічною для Explorer.exe і подібних, але це повинно дати вам добру вихідну точку.


Процес, який я хочу вбити, є основним. tasklist /fi "imagename eq explorer.exe" /v /fo listговорить мені, що його віконце - "N / A". На жаль, "" windowtitle eq N / A "не працює. Будь-які ідеї?
Ход - Армія Моніки

А-а-а-а. gotcha. Я знайшов відповідь на це в StackOverflow, я оновлю відповідь відповідними бітами тут за посиланням.
Ƭᴇcʜιᴇ007

Я досі не бачу, як це буде працювати. Що робити, якщо немає інших відкритих вікон Провідника, окрім робочого столу?
Synetech

1

Убийте процес найнижчим PID (ідентифікатор процесу). Це було б розпочато спочатку, оскільки процеси нумеруються послідовно.


+1 Це буде працювати вперше, коли запущений пакетний файл, але оскільки перезапущено explorer.exe, новий "основний" процес матиме більш високий PID. Чи є інший спосіб?
Ход - Армія Моніки

Це правда. Однак ви можете просто вивести tasklist | find /f "explorer"і запитати, а потім просто запитати (із введенням користувача), який найменший PID для вбивства.
Міф.

@HodofHod: Найнадійнішим способом було б вибрати процес із найбільшим використанням пам'яті. Якщо ви можете використовувати MinGW ( sed, awkтощо), це зробити досить просто автоматично. Якщо ні, введення користувача може бути найкращим вибором.
Денніс

@ Adam543i, > Убити процес із найнижчим PID (ідентифікатор процесу). Це було б розпочато спочатку, оскільки процеси нумеруються послідовно. Про яку версію Windows ви говорите? Це просто неправда. Окрім випадкової функції захисту PID, я згадую щось на OldNewThing про PID, які призначаються з інтервалом (у чотири чи 16 чи щось). Справа в тому, що використовувати PID (навіть відносні) просто надто ненадійно.
Synetech

@Dennis, > Найбільш надійним способом було б вибрати процес із найбільшим використанням пам'яті. Ні. Зовсім ні. Для породженого процесу надзвичайно просто використовувати більше пам'ять.
Synetech
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.