Comment savoir quel processus «explorer.exe» est le principal?

13

J'ai un fichier de commandes qui modifie quelques fichiers de registre, puis redémarre explorer.exe pour qu'ils prennent effet. J'utilise les commandes

taskkill /f /im explorer.exe
explorer.exe

Bien sûr, cela tue tous les processus explorer.exe, y compris les fenêtres d'explorateur que j'ai ouvertes. (Évidemment, j'utilise l'option pour Launch folder windows in a separate process.)

Existe-t-il un moyen de déterminer quelle instance de explorer.exe est la principale, et de simplement tuer cela?

Hod - L'armée de Monica
la source
Tuer l'explorateur principal.exe ne fera probablement que tuer tous les autres, car ils en dépendent pour fonctionner.
cutrightjm
1
@ekaj Ce n'est pas le cas. Je peux le faire manuellement. Chaque fenêtre est un processus indépendant.
Hod - Monica's Army
Je souhaite également trouver un moyen fiable de déterminer l' explorer.exeinstance principale (associée au bureau) , mais pour la raison opposée. Je trouve gênant que les explorer.exeprocessus générés ne soient pas toujours fermés lorsque toutes leurs fenêtres associées sont fermées. J'utilise le Gestionnaire des tâches pour les tuer et j'ai tendance à compter sur le fait que les instances générées sont généralement définies en haute priorité (pour une raison quelconque). Cela fonctionne très bien, mais s'il m'arrive de l'avoir réglé sur normal (pour des raisons évidentes), alors je risque de tuer accidentellement le processus principal.
Synetech
@Synetech La solution à cela est taskkill /f /im explorer.exe /fi "windowtitle ne N/A". Pour une raison quelconque, copier / coller cela dans l'invite cmd ne fonctionne pas; vous devez le taper à la main. N'a pas essayé un fichier batch.
Hod - Monica's Army
1
Vous avez divisé le problème en une partie facile et une partie impossible, résolu la partie facile et demandez maintenant de l'aide pour la partie impossible. Il est très probable que la partie "facile" de la solution ne soit pas correcte (par exemple, ce que vous essayez de faire pourrait être réalisé avec une stratégie de groupe), donc ce serait bien si votre question incluait le problème d'origine que vous essayez de résoudre . Tuer des processus qui ne vous appartiennent pas est rarement correct.
Simon Richter

Réponses:

9

Approche basée sur le titre de la fenêtre

@ techie007 a suggéré de tuer le explorer.exetitre de la fenêtre N/A.

Commander

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

Comment ça fonctionne

  • tasklist /nh /v /fi "imagename eq explorer.exe"répertorie verbalement tous les processus avec le nom de l'image explorer.exe.

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

    s'exécute COMMAND1. Pour chaque ligne de sortie, il définit les variables %%pet %%qle deuxième et le dixième "jeton" (délimité par un espace) et s'exécute COMMAND2.

    Dans le cas de taskkill /v, %%p contient maintenant le PID et %%qle (début de) le titre de la fenêtre.

  • if "%%q"=="N/A" taskkill /f /pid %%pvérifie si le titre de la fenêtre est N/A.

    Si c'est le cas, il termine le processus avec taskkill.

Approche basée sur l'utilisation de la mémoire

@Syntech a souligné que cela n'est pas fiable pour l'Explorateur Windows, mais dans les programmes, le processus principal a toujours la mémoire la plus élevée.

Commander

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

Comment ça fonctionne

  • tasklist /nh /fi "imagename eq explorer.exe"répertorie tous les processus avec un nom d'image explorer.exe.

  • sort /+65 trie la sortie précédente en commençant par le 65e caractère (où commence l'utilisation de mem).

  • for /f "tokens=2" %%p in ('COMMAND') do @set explorerpid=%%pdéfinit explorerpidla deuxième tokens=2entrée ( ) - délimitée par des espaces - de chaque ligne de la sortie de COMMAND, qui est le PID correspondant.

  • Puisque tasklistla sortie de a été triée, explorerpidcontient le PID revendiqué et taskkillmet fin au processus.

Dennis
la source
Je vous remercie! Mais pour une raison quelconque, cela ne fonctionne pas encore pour moi. Je travaille pour voir si je peux le modifier d'une manière ou d'une autre pour le faire fonctionner.
Hod - Monica's Army
1
@Dennis, > pour définir explorerpid sur le PID de l'explorateur.exe avec l'utilisation de mémoire la plus élevée. Cela devrait être le moyen le plus fiable de déterminer le processus principal. Non pas correct. Ouvrez un nouveau processus de fenêtre (par exemple, via un raccourci) et accédez à un dossier contenant de nombreuses images et affichez-les en mode vignette. Le nouveau processus dépassera rapidement celui d'origine dans l'utilisation de la mémoire. > Eh bien, vous n'avez pas mentionné que vous n'utilisez pas la configuration par défaut. La question est: Comment savoir quel processus "explorer.exe" est le principal? Sinon, comment pensez-vous que cela pourrait être un problème?
Synetech
L'approche fenêtrée et l'approche mémoire fonctionnent maintenant. Je pense que je vais aller avec fenêtre - semble plus fiable. Merci beaucoup!
Hod - Monica's Army
3

Peut-être pouvez-vous dire à Explorer d'afficher le chemin dans la barre de titre, puis utiliser le WINDOWTITLEfiltre pour le tuer en fonction de cela?

  • Ouvrez l'explorateur
  • presse Alt
  • Cliquez sur "Outils (élément de menu)"
  • Cliquez sur "Options des dossiers ... (élément de menu)"
  • Cliquez sur "Afficher (onglet page)" dans "Options des dossiers"
  • Cliquez pour sélectionner «Afficher le chemin d'accès complet dans la barre de titre (thème classique uniquement)» dans «Options des dossiers»
  • Cliquez sur "Appliquer" -> "OK"

Le chemin n'apparaîtra pas dans la barre de titre d'Explorer avec les thèmes «non classiques», mais il est (maintenant) là; ce n'est tout simplement pas visible.

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

Vous devrez peut-être basculer temporairement vers un thème classique pour déterminer le chemin / titre de l'instance de l'Explorateur que vous souhaitez redémarrer.

Pas 100% infaillible, mais toutes les fenêtres de l'Explorateur qui n'ont pas ce chemin (partiel) dans le titre seraient au moins sûres. :)

Éditer:

Étant donné que vous souhaitez saisir celui avec le titre "N / A", vous devrez probablement utiliser un fichier de commandes pour pouvoir tokeniser les résultats d'une TASKLIST et utiliser ces résultats de jetons pour utiliser TASKKIL pour tuer par PID.

J'ai trouvé une réponse sur StackOverflow.com qui résout ce problème:

De la question Taskkill un processus sans titre? est cette réponse qui comprend cet exemple de fichier de commandes:

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

Vous voudrez changer la commande 'TASKLIST / V' pour qu'elle soit plus spécifique à Explorer.exe et autres, mais cela devrait vous donner un bon point de départ.

Ƭᴇcʜιᴇ007
la source
Le processus que je veux tuer est le principal. tasklist /fi "imagename eq explorer.exe" /v /fo listme dit que son titre de fenêtre est "N / A". Malheureusement, "" windowtitle eq N / A "ne fonctionne pas. Des idées?
Hod - Monica's Army
Ahhhhhh. je t'ai eu. J'ai trouvé une réponse à cela sur StackOverflow, je mettrai à jour la réponse avec les bits pertinents ici avec un lien.
Ƭᴇcʜιᴇ007
Je ne vois toujours pas comment cela fonctionnerait. Que se passe-t-il s'il n'y a pas de fenêtres Explorer ouvertes autres que le bureau?
Synetech
1

Tuez le processus avec le PID (ID de processus) le plus bas. Il aurait été démarré en premier, car les processus sont numérotés séquentiellement.

Mythrillique
la source
+1 Cela fonctionnerait pour la première fois que le fichier de commandes est exécuté, mais puisque explorer.exe est redémarré, le nouveau processus "principal" aura un PID plus élevé. Y a-t-il un autre moyen?
Hod - Monica's Army
C'est vrai. Cependant, vous pouvez simplement générer tasklist | find /f "explorer"et demander, puis simplement demander (avec une entrée utilisateur) quel est le PID le plus bas à tuer.
Mythrillic
@HodofHod: Le moyen le plus fiable serait de sélectionner le processus avec l'utilisation de mémoire la plus élevée. Si vous pouvez utiliser MinGW ( sed, awk, etc.), qui assez facile à faire automatiquement. Sinon, la saisie de l'utilisateur pourrait être le meilleur choix.
Dennis
@ Adam543i, > Tuez le processus avec le PID (ID de processus) le plus bas. Il aurait été démarré en premier, car les processus sont numérotés séquentiellement. De quelle version de Windows parlez-vous? Ce n'est tout simplement pas vrai. Mis à part la fonction de sécurité PID aléatoire, je me souviens de quelque chose sur OldNewThing sur les PID attribués à intervalles (de quatre ou 16 ou quelque chose). Le fait est que l'utilisation de PID (même relatifs) est tout simplement trop peu fiable.
Synetech
@Dennis, > Le moyen le plus fiable serait de sélectionner le processus avec la plus grande utilisation de mémoire. Nan. Pas du tout. Il est extrêmement facile pour un processus généré d'avoir une utilisation de mémoire plus élevée.
Synetech