Проблема
В одной части командного файла (вид, см. дополнительную информацию) мне нужно перезапустить Explorer, поэтому я использую проверенный метод
taskkill /f /im explorer.exe >nul
explorer.exe
Тогда это произойдет
-
explorer.exe
успешно завершен -
explorer.exe
запускается (см. изображение 2), но только Откроется окно Explorer, которое я оставил с неопределенным сроком (см. Изображение 1)
Затем я могу только перезапустить Explorer, запустив новую задачу из задачи
Менеджер, как я предполагаю, Win + R
является частью Проводника.
Дополнительная информация
Теперь я говорю "вид", когда я запускаю командный файл из самопроизвольного SFX
архив, созданный с помощью WinRAR. Итак, когда выполняется, содержимое архива
извлечен в %temp%
и пользовательский файл (обычно это загрузочный ремень и в
этот случай, мой командный файл) запускается при успешном извлечении.
До сих пор я вывел
-
explorer.exe
определенно полностью убит. - Пакетный файл определенно вызывается и выполняется правильно, поскольку он запускается и
все остальное в script работает так, как было разработано, за исключением строки, которая
начинает
explorer.exe
- Команда перезапуска проводника не является "плохо синхронизирована" или что-то еще, поскольку я попробовал отложить его.
- Пакетный файл отлично работает при извлечении вручную из архива, поэтому это не проблема с процессами сжатия или извлечения.
- Даже с такими командами, как
start explorer.exe | cmd.exe
Explorer не перезагрузитесь должным образом, так что это определенно не проблема с файлом.bat
.
Я могу подтвердить, что он работает на Windows XP и Windows 7 x86, но не на Windows 7 x64 (это моя система).
Статус
В настоящий момент я подозрительно отношусь к WinRAR, поскольку я доказал, что сам код работает. Итак, я создаю self-executing SFX с различными версиями WinRAR. До сих пор я пробовал версии:
- 4.11 x86
- 4.11 x64
- 4.20b3 x86
- 4.20b3 x64
и имел одинаковые результаты каждый раз.
Вчера я отправил сообщение об ошибке на [email protected], а получил ответ от Сам Евгений Рошаль сегодня утром
Здравствуйте, SFX-модуль использует ShellExecuteEx для запуска приложения настройки. Обычно он работает хорошо. Я не знаю, почему Explorer решает переключиться в оконный режим. Теперь я построил небольшую автономную программу
#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);
}
который запускает test.bat с содержимым, как в вашем примере. Эта программа показывает точно такое же поведение, как WinRAR SFX, поэтому Explorer запущен в окне.
и второе электронное письмо сегодня утром
Извините, теперь не советую. Я заменил ShellExecuteEx на 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);
}
но результат тот же. Я пытался использовать другие флаги SW_, например SW_SHOWDEFAULT или SW_RESTORE с ShellExecuteEx также как "открытый", и "исследовать" lpVerb, но это не помогает. Пока я не понять логику этого оконного и настольного режимов.
Я понимаю, что перспектива мрачна, но я надеюсь на помощь кому-то..
Доказательство/доказательство
Ссылка на архив SFX, демонстрирующий это, если кто-то этого захочет: https://dl.dropbox.com/u/27573003/Social%20Distribution/restart-explorer.exe
Здесь вы можете заметить, что я запускаю команды внутри виртуальной машины (как обозначается
VMwareTray.exe
), но это не конфликт, вызванный VM. Я тестировал то же самое
файлы на моей собственной хост-системе (которая является той же ОС) и имеют одинаковые
Результаты.
Обновление
Я испытываю подобные "работы вне SFX-архива, но не из одного",
проблемы при использовании REG ADD
в совершенно другом проекте.
Я просто не думаю, что SFX-архивы прекрасно сочетаются с пакетными файлами.