Como posso saber qual processo “explorer.exe” é o principal?

13

Eu tenho um arquivo em lotes que altera alguns arquivos do Registro e, em seguida, reinicia o explorer.exe para que eles entrem em vigor. Estou usando os comandos

taskkill /f /im explorer.exe
explorer.exe

Isso, claro, mata todos os processos explorer.exe, incluindo as janelas do explorador que tenho abertas. (Obviamente, estou usando a opção de Launch folder windows in a separate process.)

Existe alguma maneira que eu possa determinar qual instância do explorer.exe é o principal e apenas matar isso?

HodofHod
fonte
Matar o explorer.exe principal provavelmente matará todos os outros, já que eles dependem dele para serem executados.
cutrightjm
1
@ ekaj Isso não acontece. Eu posso fazer isso manualmente. Cada janela é um processo independente.
HodofHod
Estou interessado em encontrar uma maneira confiável de determinar o primário (associado à área de trabalho) explorer.exe exemplo também, mas pela razão oposta. Eu acho irritante que tenha desovado explorer.exe os processos nem sempre são encerrados quando todas as janelas associadas são fechadas. Eu uso o Gerenciador de Tarefas para matá-los e tendem a confiar no fato de que as instâncias geradas geralmente são definidas como de alta prioridade (por algum motivo). Isso funciona bem, mas se por acaso eu configurá-lo para o normal (por razões óbvias), então corro o risco de matar acidentalmente o processo primário.
Synetech
@Synetech A solução para isso é taskkill /f /im explorer.exe /fi "windowtitle ne N/A". Por alguma razão, copiar / colar isso no prompt do cmd não funciona; você tem que digitá-lo manualmente. Não tentei um arquivo em lotes.
HodofHod
1
Você dividiu o problema em uma parte fácil e impossível, resolveu a parte fácil e agora está pedindo ajuda com a parte impossível. É bem provável que a parte "fácil" da solução não esteja correta (por exemplo, o que você está tentando fazer poderia ser alcançado com uma política de grupo), então seria bom se sua pergunta incluísse o problema original que você está tentando resolver. . Processos de morte que não lhe pertencem raramente são corretos.
Simon Richter

Respostas:

9

Abordagem baseada em título de janela

@ techie007 sugerido matando o explorer.exe com título da janela N/A.

Comando

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

Como funciona

  • tasklist /nh /v /fi "imagename eq explorer.exe" lista com verbosidade todos os processos com nome de imagem explorer.exe.

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

    executa COMMAND1. Para cada linha de saída, define as variáveis %%p e %%q para o segundo e décimo "token" (delimitado pelo espaço) e executa COMMAND2.

    No caso de taskkill /v, %%p agora detém o PID e %%q o (início de) o título da janela.

  • if "%%q"=="N/A" taskkill /f /pid %%p verifica se o título da janela é N/A.

    Se assim for, encerra o processo com taskkill.

Abordagem baseada no uso de memória

@Syntech apontou que isso não é confiável para o Windows Explorer, mas nos programas, o processo principal sempre tem o maior uso de memória.

Comando

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

Como funciona

  • tasklist /nh /fi "imagename eq explorer.exe" lista todos os processos com nome de imagem explorer.exe.

  • sort /+65 classifica a saída anterior, começando com o 65º caractere (onde começa o uso de mem).

  • for /f "tokens=2" %%p in ('COMMAND') do @set explorerpid=%%p Conjuntos explorerpid para o segundo ( tokens=2 ) entrada - delimitada por espaços - de cada linha da saída de COMMAND, que é o PID correspondente.

  • Desde a tasklist a saída foi classificada, explorerpid detém o PID reivindicado e taskkill encerra o processo.

Dennis
fonte
Obrigado! Mas por alguma razão isso não está funcionando para mim, ainda. Eu estou trabalhando para ver se eu posso modificá-lo de alguma forma para fazê-lo funcionar.
HodofHod
1
@Dennis, & gt; para definir o explorerpid para o PID do explorer.exe com o maior uso de memória. Essa deve ser a maneira mais confiável de determinar o processo principal. Não está correto. Abra um novo processo de janela (por exemplo, por meio de um atalho) e navegue até uma pasta com muitas fotos e visualize-as no modo miniatura. O novo processo rapidamente ultrapassará o original em uso de memória. & gt; Bem, você não mencionou que não está usando a configuração padrão. A questão é Como posso saber qual processo "explorer.exe" é o principal? De que outra forma você acha que isso poderia ser um problema?
Synetech
Tanto a abordagem em janela quanto a abordagem de memória agora funcionam. Eu acho que vou com janelas - parece mais confiável. Muito obrigado!
HodofHod
3

Talvez você possa dizer ao Explorer para mostrar o caminho na barra de título, e então usar o WINDOWTITLE filtrar para matá-lo com base nisso?

  • Abra o Explorer
  • pressione Alt
  • Clique em "Ferramentas (item de menu)"
  • Clique em "Opções de pasta ... (item de menu)"
  • Clique em "View (page tab)" em "Folder Options"
  • Clique para selecionar "Exibir o caminho completo na barra de título (somente tema clássico)" em "Opções de pasta"
  • Clique em "Aplicar" - & gt; "ESTÁ BEM"

O caminho não será exibido na barra de título do Explorer com os temas "não clássicos", mas está (agora) lá; simplesmente não é visível.

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

Talvez seja necessário alternar temporariamente para um tema clássico para determinar qual é o caminho / título da instância do Explorer que você deseja reiniciar.

Não é 100% à prova de erros, mas qualquer janela do Explorer que não tenha esse caminho (parcial) no título seria pelo menos segura. :)

editar:

Uma vez que você quer pegar o título "N / A", você provavelmente terá que usar um arquivo em lotes para que você possa converter os resultados de um TASKLIST e usar esses resultados de token para usar TASKKIL para matar por PID.

Eu encontrei uma resposta para StackOverflow.com que aborda isso:

Da pergunta Taskkill um processo sem título? é esta resposta que inclui este arquivo de lote de exemplo:

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

Você vai querer mudar o comando 'TASKLIST / V' para ser mais específico do Explorer.exe e tal, mas deve ser um bom ponto de partida.

Ƭᴇcʜιᴇ007
fonte
O processo que quero matar é o principal. tasklist /fi "imagename eq explorer.exe" /v /fo list me diz que o seu windowtitle é "N / A". Infelizmente, `" windowtitle eq N / A "não funciona. Alguma ideia?
HodofHod
Ahhhhhh Peguei vocês. Eu encontrei uma resposta para isso no StackOverflow, atualizarei a resposta com os bits relevantes aqui com um link.
Ƭᴇcʜιᴇ007
Eu ainda não vejo como isso funcionaria. E se não houver janelas abertas no Explorer além da área de trabalho?
Synetech
1

Mate o processo com o PID mais baixo (ID do processo). Teria sido iniciado primeiro, pois os processos são numerados sequencialmente.

Mythrillic
fonte
+1 Isso funcionaria pela primeira vez que o arquivo em lote é executado, mas como o explorer.exe é reiniciado, o novo processo "principal" terá um PID mais alto. Existe outro caminho?
HodofHod
Isso é verdade. No entanto, você poderia apenas produzir tasklist | find /f "explorer" e pergunte então é só pedir (com entrada do usuário) qual é o menor PID para matar.
Mythrillic
@HodofHod: A maneira mais confiável seria selecionar o processo com o maior uso de memória. Se você pode usar MinGW ( sed, awk, etc.), isso muito fácil de fazer automaticamente. Caso contrário, a entrada do usuário pode ser a melhor escolha.
Dennis
@ Adam543i, & gt; Mate o processo com o PID mais baixo (ID do processo). Teria sido iniciado primeiro, pois os processos são numerados sequencialmente. Qual versão do Windows você está falando? Isso simplesmente não é verdade. Além da função de segurança PID aleatória, lembro-me de algo no OldNewThing sobre PIDs sendo atribuídos em intervalos (de quatro ou 16 ou algo assim). O fato é que usar PIDs (mesmo os relativos) é muito pouco confiável.
Synetech
@Dennis, & gt; A maneira mais confiável seria selecionar o processo com o maior uso de memória. Não. De modo nenhum. É extremamente fácil para um processo gerado ter um uso maior de memória.
Synetech