13

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

taskkill /f /im explorer.exe
explorer.exe

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

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

3 ответа3

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 завершает процесс.

3

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

1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .