web-dev-qa-db-fra.com

Le redémarrage de Explorer.exe n'ouvre qu'une fenêtre de l'Explorateur

Le problème

Dans une partie d'un fichier de commandes (en quelque sorte, voir Informations supplémentaires), je dois redémarrer Explorer. J'utilise donc la méthode de test éprouvée.

taskkill /f /im Explorer.exe >nul
Explorer.exe

Alors cela arrive

  1. Explorer.exe est terminé avec succès
  2. Explorer.exe est démarré (voir image 2), mais seule une fenêtre Explorer s'ouvre, qu'il me reste indéfiniment (voir image 1)

Je ne peux alors que redémarrer correctement Explorer en lançant une nouvelle tâche à partir de Task Manager, puisque je suppose que Win + R fait partie de Explorer.

Informations supplémentaires

Maintenant, je dis "en quelque sorte" car je suis en train d'exécuter le fichier de commandes à partir d'une archive .X. SFX à auto-exécution, créée avec WinRAR. Ainsi, une fois exécuté, le contenu de l'archive est Extrait en %temp% et un fichier défini par l'utilisateur (généralement un boot-strapper et, dans Ce cas, mon fichier de traitement par lots) est exécuté une fois l'extraction réussie.

Jusqu'à présent, j'ai déduit

  1. Explorer.exe est définitivement en train d'être tué.
  2. Le fichier de commandes est définitivement appelé et exécuté correctement, car il est exécuté et Tout le reste du script fonctionne comme prévu, à l'exception de la ligne dans laquelle Starts Explorer.exe
  3. La commande pour redémarrer Explorer n'est pas "mal synchronisée", ou quoi que ce soit, car j'ai essayé de la retarder.
  4. Le fichier de commandes fonctionne parfaitement lorsqu'il est extrait manuellement de l'archive, ce qui ne pose pas de problème pour les processus de compression ou d'extraction.
  5. Même avec des commandes telles que start Explorer.exe | cmd.exe, l'explorateur ne redémarre pas correctement. Ce n'est donc absolument pas un problème avec le fichier .bat.

Je peux confirmer que cela fonctionne sous Windows XP et Windows 7 x86, mais pas sous Windows 7 X64 (qui est mon système).

Statut

Pour le moment, je me méfie de WinRAR, car j’ai prouvé que le code lui-mêmefonctionne. Donc, je crée le SFX à exécution automatique avec différentes versions de WinRAR. Jusqu'à présent, j'ai essayé des versions:

  • 4.11 x86
  • 4.11 x64
  • 4.20b3 x86
  • 4.20b3 x64

et a eu les mêmes résultats à chaque fois.

J'ai soumis un rapport de bug à [email protected] hier et reçu une réponse de Eugene Roshal lui-même ce matin

Bonjour, Le module SFX utilise ShellExecuteEx pour démarrer une application d’installation . Normalement ça marche bien. Je ne sais pas pourquoi Explorer décide de changer en mode fenêtré . Maintenant, j'ai construit un petit programme autonome

#include <windows.h>    
void main()
{
  SHELLEXECUTEINFO si;
  memset(&si,0,sizeof(si));
  si.cbSize=sizeof(si);
  si.lpFile="test.bat";
  si.nShow=SW_SHOWNORMAL;
  ShellExecuteEx(&si);
}

qui exécute test.bat avec un contenu identique à celui de votre exemple. Ce programme montre exactement le même comportement que WinRAR SFX, donc Explorer est lancé dans la fenêtre.

et un deuxième mail ce matin

Désolé, pas de conseil maintenant. J'ai remplacé ShellExecuteEx par CreateProcess

#include <windows.h>
void main()
{
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  memset(&si,0,sizeof(si));
  si.cb=sizeof(si);
  CreateProcess(NULL,"test.bat",NULL,NULL,TRUE,0,NULL,NULL,&si,&pi);
}

mais le résultat est le même. J'ai essayé d'utiliser d'autres drapeaux SW_ comme SW_SHOWDEFAULT ou SW_RESTORE avec ShellExecuteEx également en tant que "open" et "explorer" lpVerb, mais cela n’aide en rien. Pour l'instant je ne le fais pas comprendre la logique derrière ce mode fenêtré par rapport au bureau.

Je réalise que les perspectives sont sombres, mais j'espère que cela aidera quelqu'un ..

Preuve/Preuve

Lien vers une archive SFX qui le démontre, si quelqu'un le souhaite: https://dl.dropbox.com/u/27573003/Social%20Distribution/restart-Explorer.exe

image 1

image 2

Vous remarquerez peut-être ici que j'exécute les commandes à l'intérieur d'un VM (comme indiqué par VMwareTray.exe), mais il ne s'agit pas d'un conflit provoqué par un ordinateur virtuel. J'ai testé exactement les mêmes fichiers Sur mon propre système hôte (le même système d'exploitation) et obtenu les mêmes résultats

Mettre à jour

Je rencontre des "travaux en dehors d’une archive SFX similaires, mais pas d’une", des problèmes liés à l'utilisation de REG ADD dans un projet complètement différent . Je ne pense pas que les archives SFX fonctionnent bien avec des fichiers de traitement par lots.

23
mythofechelon

L'autre jour, je parcourais certaines des options les plus avancées de WinRAR et suis tombé sur cet onglet:

enter image description here

Dès que j'ai vu que je le soupçonnais de faire partie du problème et de la solution, ce problème ne se produisant que sous Windows 7 x64.

Comme on pouvait le supposer, l’utilisation du module Default64.SFX au lieu du module par défaut Default.SFX a entièrement résolu le problème. Finalement.

0
mythofechelon

"Je me demande si une partie de Win-RAR est exécutée en mode 32 bits. Pourriez-vous même démarrer Explorer64 à partir d'un processus 32 bits? Je suis à peu près sûr que Windows ne le fera pas. . "

Lorsque je lance Explorer.exe à partir de ProcessHacker (gestionnaire de processus 32 bits), une fenêtre Explorer s’ouvre.

Mais je peux le forcer à démarrer l’explorateur 64 bits avec ceci:

%systemroot%\sysnative\cmd.exe /c start /B Explorer.exe

sysnative est un mot clé que Windows reconnaît pour ignorer la redirection du système de fichiers pour les fichiers 32 bits/64 bits ( http://msdn.Microsoft.com/en-us/library/windows/desktop/aa384187(v=vs. 85) .aspx Profitez!

14
Doug Benham

J'ai eu le même problème et j'ai constaté que toutes les solutions ici ne fonctionnaient toujours pas à partir d'un script batch.

Aucun de ceux-ci n'a fonctionné complètement:

start Explorer.exe
start Explorer
explorer.exe
Explorer

parce qu'ils ont tous soit ouvert une fenêtre (et ne plus afficher la barre des tâches), ou que le script de traitement par lots a ensuite été suspendu par la suite et qu'il ne pouvait plus exécuter de commande

J'ai trouvé que cette ligne dans le fichier de commandes a fonctionné (après avoir tué Explorer.exe):

start "" "%windir%\Explorer.exe"

et a également permis à d'autres commandes d'être exécutées après dans le script

8
sparrowt

Cela fonctionne sous Windows 7:

taskkill /f /IM Explorer.exe
start Explorer.exe
exit
6
Jacob Seleznev

Pour redémarrer Explorer.exe, cela a fonctionné pour moi.

powershell.exe Stop-Process -processname Explorer
2
Matt

Essayer

%windir%\Explorer.exe
start %windir%\Explorer.exe
start /d%windir% Explorer.exe
1
panda-34

Lorsque vous exécutez Explorer.exe à partir d'une application 32 bits sous Windows 64 bits, le chemin d'accès sera redirigé vers le répertoire SysWOW64 qui contient Explorer.exe 32 bits.

Sous XP64, ce n'était pas si grave. Dans le gestionnaire de tâches, vous pouvez voir le fichier Explorer.exe 32 bits en cours d'exécution, mais il a été lancé en tant que shell. Dans Windows 10 (comme je suis venu à ce problème, il semble que ce soit introduit dans Windows 7), l'explor.exe 32 bits est un stub qui crée une nouvelle instance de l'explorateur 64 bits. Il passe probablement un chemin sur la ligne de commande ici pour qu'Explorer.exe 64 bits ouvre une fenêtre au lieu de démarrer le shell. 

C'est donc toujours comme avant que vous puissiez contrôler si une fenêtre ou un shell doit être démarré en démarrant Explorer.exe avec ou sans chemin en paramètre de ligne de commande.

Au lieu de cela, vous devez forcer le démarrage de l’explorateur 64 bits à partir de l’application 32 bits et tout va bien. Pour ce faire, une méthode utilise le répertoire sysnatif mentionné ci-dessus. Mais une autre méthode consiste à utiliser Wow64DisableWow64FsRedirection/Wow64RevertWow64FsRedirection. 

J'ai fait le dernier et peut confirmer que cela fonctionne bien. Pour les API CreateProcess et ShellExecuteEx.

1
Arnoud Mulder

Utilisez ceci (.bat avec des privilèges d'administrateur) en x64 ou x86

tasklist /fi "imagename eq Explorer*" | find /i "Explorer*"
if not errorlevel 1 (taskkill /f /im "Explorer*") else (
start %windir%\Explorer.exe
0
user4839775

Essayez d’ajouter une clé Explorer.exe aux chemins d’application dans le registre.

HKEY_LOCAL_MACHINE\LOGICIEL\Microsoft\Windows\CurrentVersion\App Paths\Explorer.exe

(Par défaut) C:\Windows\Explorer.exe

Chemin C:\Windows

ou copiez ce qui suit dans le bloc-notes et enregistrez-le en tant que fichier .reg, puis exécutez-le:


Éditeur de registre Windows version 5.00

[HKEY_LOCAL_MACHINE\LOGICIEL\Microsoft\Windows\CurrentVersion\App Paths\Explorer.exe] @ = "C:\Windows\Explorer.exe" "Path" = "C:\Windows"

0
kenner116

Ce qui a fonctionné pour moi dans Windows 7 64 bits était "C:\Windows\expstart.exe" Ou simplement Expstart.exe

0
Mike Hadden

Avoir le même problème avec Visual Studio.

Ce qui fonctionne pour moi (Win 7 Pro 64bit):

PPM sur Nom du projet, sélectionnez "Propriétés"

Propriétés de configuration> Evénements de génération> Evénement de pré-génération

taskkill /im Explorer.exe /f

Propriétés de configuration> Evénements de génération> Evénement post-génération

start "" "C:\Windows\Explorer.exe"

Mais cela pose un autre problème (le IDE est gelé après l’explorateur) et maintenant je ne peux que redémarrer le IDE pour relancer la commande de construction ... 

0
Paweł Liszka

J'ai vu des problèmes similaires avant de faire cela en C #. Le processus a dû être appelé en appelant Explorer Shell plutôt que la fenêtre de l'Explorateur, mais je n'ai rencontré aucun problème par lots.

Essayez d'utiliser ceci:

taskkill /im Explorer.exe /f
Explorer

La différence entre les autres réponses étant Explorer plutôt que Explorer.exe qui a déjà causé des problèmes pour moi.

Cela fonctionne sur mon PC Win7 x64.

J'espère que cela t'aides!

0
Bali C