У меня есть пакетный файл, который изменяет несколько файлов реестра, а затем перезапускает explorer.exe, чтобы они вступили в силу. Я использую команды
taskkill /f /im explorer.exe
explorer.exe
Это, конечно, убивает все процессы explorer.exe, включая окна проводника, которые у меня открыты. (Очевидно, я использую опцию Launch folder windows in a separate process
.)
Есть ли способ определить, какой экземпляр explorer.exe является основным, и просто убить его?
windows
windows-explorer
process
batch-file
Ход - Армия Моники
источник
источник
explorer.exe
экземпляра, но по противоположной причине. Меня раздражает, что порожденныеexplorer.exe
процессы не всегда закрываются, когда все связанные с ними окна закрыты. Я использую диспетчер задач, чтобы убить их, и склоняюсь к тому факту, что порожденные экземпляры обычно имеют высокий приоритет (по некоторым причинам). Это работает нормально, но если мне удалось установить его в нормальное состояние (по очевидным причинам), тогда я рискую случайно убить основной процесс.taskkill /f /im explorer.exe /fi "windowtitle ne N/A"
. По какой-то причине копирование / вставка этого в приглашение cmd не работает; Вы должны напечатать это вручную. Не пробовал командный файл.Ответы:
Подход на основе заголовка окна
@ techie007 предложил убить
explorer.exe
с заголовком окнаN/A
.команда
Как это устроено
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, но в программах основной процесс всегда использует наибольшее количество памяти.
команда
Как это устроено
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
завершает процесс.источник
Возможно, вы можете попросить Explorer показать путь в строке заголовка, а затем использовать
WINDOWTITLE
фильтр, чтобы убить его, основываясь на этом?Путь не будет отображаться в строке заголовка Explorer с «неклассическими» темами, но он есть (сейчас); это просто не видно
taskkill /F /FI "WINDOWTITLE eq C:\PathToThing\RunningInExplorer\ToRestart*"
Возможно, вам придется временно переключиться на классическую тему, чтобы определить путь / заголовок для экземпляра Explorer, который вы хотите перезапустить.
Не на 100% надежно, но любые окна Explorer, у которых нет этого (частичного) пути в заголовке, будут безопасны, по крайней мере. :)
редактировать:
Поскольку вы хотите получить файл с заголовком «N / A», вам, вероятно, придется использовать командный файл, чтобы можно было маркировать результаты TASKLIST и использовать эти результаты токена, чтобы использовать TASKKIL для уничтожения с помощью PID.
Я нашел ответ на StackOverflow.com, который решает эту проблему:
Из вопроса Taskkill безымянный процесс? является такой ответ , который включает в себя этот пример пакетного файла:
Вы можете изменить команду 'TASKLIST / V', чтобы она была более специфичной для Explorer.exe и тому подобного, но она должна дать вам хорошую отправную точку.
источник
tasklist /fi "imagename eq explorer.exe" /v /fo list
говорит мне, что его заголовок окна "N / A". К сожалению, `" windowtitle eq N / A "не работает. Есть идеи?Убейте процесс с самым низким PID (ID процесса). Это было бы начато сначала, поскольку процессы нумеруются последовательно.
источник
tasklist | find /f "explorer"
и спросить, а затем спросить (с помощью ввода пользователя), какой самый низкий PID для уничтожения.sed
,awk
и т. Д.), Это довольно легко сделать автоматически. Если нет, то пользовательский ввод может быть лучшим выбором.