Как определить, какой процесс «explorer.exe» является основным?

13

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

taskkill /f /im explorer.exe
explorer.exe

Это, конечно, убивает все процессы explorer.exe, включая окна проводника, которые у меня открыты. (Очевидно, я использую опцию Launch folder windows in a separate process.)

Есть ли способ определить, какой экземпляр explorer.exe является основным, и просто убить его?

Ход - Армия Моники
источник
Уничтожение основного файла explorer.exe, вероятно, просто уничтожит все остальные, поскольку они зависят от его запуска.
cutrightjm
1
@ekaj Это не так. Я могу сделать это вручную. Каждое окно является независимым процессом.
Ход - Армия Моники
Я заинтересован в поиске надежного способа определения основного (связанного с рабочим столом) 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 Explorer, но в программах основной процесс всегда использует наибольшее количество памяти.

команда

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-го символа (где начинается использование mem).

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

  • Поскольку tasklistвыходной файл был отсортирован, explorerpidсодержит заявленный PID и taskkillзавершает процесс.

Деннис
источник
Спасибо! Но по некоторым причинам это пока не работает для меня. Я работаю, чтобы посмотреть, смогу ли я как-то изменить его, чтобы он заработал.
Ход - Армия Моники
1
@Dennis, > для установки explorerpid на PID файла explorer.exe с наибольшим использованием памяти. Это должен быть самый надежный способ определения основного процесса. Нет не правильно. Откройте новый процесс окна (например, с помощью ярлыка), перейдите в папку с большим количеством изображений и просмотрите их в режиме миниатюр. Новый процесс быстро обгонит оригинальный при использовании памяти. > Ну, вы не упомянули, что не используете конфигурацию по умолчанию. Вопрос в том, как определить, какой процесс «explorer.exe» является основным? Как еще вы думаете, что это может быть проблемой?
Synetech
И оконный подход, и подход памяти теперь работают. Я думаю, я пойду с окнами - кажется более надежным. Огромное спасибо!
Ход - Армия Моники
3

Возможно, вы можете попросить Explorer показать путь в строке заголовка, а затем использовать WINDOWTITLEфильтр, чтобы убить его, основываясь на этом?

  • Открытый проводник
  • Нажмите Alt
  • Нажмите «Инструменты (пункт меню)»
  • Нажмите «Параметры папки ... (пункт меню)»
  • Нажмите «Просмотр (вкладка страницы)» в «Параметры папки»
  • Нажмите, чтобы выбрать «Показать полный путь в строке заголовка (только классическая тема)» в «Параметры папки»
  • Нажмите «Применить» -> «ОК»

Путь не будет отображаться в строке заголовка Explorer с «неклассическими» темами, но он есть (сейчас); это просто не видно

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

Возможно, вам придется временно переключиться на классическую тему, чтобы определить путь / заголовок для экземпляра Explorer, который вы хотите перезапустить.

Не на 100% надежно, но любые окна Explorer, у которых нет этого (частичного) пути в заголовке, будут безопасны, по крайней мере. :)

редактировать:

Поскольку вы хотите получить файл с заголовком «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 и тому подобного, но она должна дать вам хорошую отправную точку.

Ƭᴇcʜιᴇ007
источник
Процесс, который я хочу убить, является основным. tasklist /fi "imagename eq explorer.exe" /v /fo listговорит мне, что его заголовок окна "N / A". К сожалению, `" windowtitle eq N / A "не работает. Есть идеи?
Ход - Армия Моники
Ahhhhhh. Попался. Я нашел ответ на это в StackOverflow, я обновлю ответ соответствующими битами здесь со ссылкой.
Ƭᴇcʜιᴇ007
Я до сих пор не понимаю, как это будет работать. Что делать, если нет открытых окон Explorer, кроме рабочего стола?
Synetech
1

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

Mythrillic
источник
+1 Это сработает в первый раз, когда запускается пакетный файл, но, так как explorer.exe перезапускается, новый «основной» процесс будет иметь более высокий PID. Есть ли другой способ?
Ход - Армия Моники
Это верно. Однако вы можете просто вывести tasklist | find /f "explorer"и спросить, а затем спросить (с помощью ввода пользователя), какой самый низкий PID для уничтожения.
Мифриловое
@HodofHod: Самый надежный способ - выбрать процесс с наибольшим использованием памяти. Если вы можете использовать MinGW ( sed, awkи т. Д.), Это довольно легко сделать автоматически. Если нет, то пользовательский ввод может быть лучшим выбором.
Деннис
@ Adam543i, > Завершите процесс с самым низким PID (ID процесса). Это было бы начато сначала, поскольку процессы нумеруются последовательно. О какой версии Windows вы говорите? Это просто неправда. Помимо функции безопасности случайного PID, я вспоминаю кое-что на OldNewThing о назначении PID с интервалами (от четырех до 16 или около того). Дело в том, что использование PID (даже относительных) слишком ненадежно.
Synetech
@Dennis, > Самый надежный способ - выбрать процесс с наибольшим использованием памяти. Нет. Не за что. Для порожденного процесса чрезвычайно легко использовать больше памяти.
Synetech