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
Explorer.exe
est terminé avec succèsExplorer.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
Explorer.exe
est définitivement en train d'être tué.Explorer.exe
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:
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
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.
L'autre jour, je parcourais certaines des options les plus avancées de WinRAR et suis tombé sur cet onglet:
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.
"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!
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
Cela fonctionne sous Windows 7:
taskkill /f /IM Explorer.exe
start Explorer.exe
exit
Pour redémarrer Explorer.exe, cela a fonctionné pour moi.
powershell.exe Stop-Process -processname Explorer
Essayer
%windir%\Explorer.exe
start %windir%\Explorer.exe
start /d%windir% Explorer.exe
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.
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
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"
Ce qui a fonctionné pour moi dans Windows 7 64 bits était "C:\Windows\expstart.exe" Ou simplement Expstart.exe
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 ...
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!