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

13

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

taskkill /f /im explorer.exe
explorer.exe

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

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

    
por HodofHod 08.06.2012 / 03:16

3 respostas

9

Abordagem baseada em títulos de janela

@ techie007 sugeriu a eliminação do explorer.exe com o 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, ele define as variáveis %%p e %%q para o segundo e décimo "token" (delimitado por espaço) e executa COMMAND2 .

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

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

    Se sim, encerra o processo com taskkill .

Abordagem baseada no uso de memória

@ A 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 o uso de mem começa).

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

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

    
por 08.06.2012 / 03:21
3

Talvez você possa dizer ao Explorer para mostrar o caminho na barra de título e, em seguida, usar o filtro WINDOWTITLE para eliminá-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 "Visualizar (guia da página)" em "Opções de pasta"
  • Clique para selecionar "Exibir o caminho completo na barra de título (somente tema Clássico)" em "Opções de pasta"
  • Clique em "Aplicar" - > "OK"

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. :)

edit:

Já que você quer pegar o título "N / A", você provavelmente terá que usar um arquivo em lotes para poder calcular os resultados de um TASKLIST adn tehn e usá-los para usar o TASKKIL para matar por PID.

Encontrei uma resposta para o StackOverflow.com que trata disso:

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.

    
por 08.06.2012 / 04:11
1

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

    
por 08.06.2012 / 03:21