Да, есть. Хотя это не поддерживаемая функция. Я делаю что-то подобное.
Возможно, это не самое причудливое решение, но оно работает надежно. Ключ должен остановить процесс RunOnceEx (rundll32.exe
) перед началом процедуры перезагрузки. Если он не остановлен, Windows остановит все процессы перед выключением в неизвестном порядке. И если этот порядок означает уничтожение нашего процесса «Перезагрузка» перед тем, как завершить процесс RunOnceEx, он продолжит работу со следующим элементом в списке RunOnceEx до того, как его убьют (и, следовательно, прервут, что нам не нужно).
Простой ответ: добавьте ключ перезагрузки, который убивает процесс RunOnceEx, а затем перезагрузится:
set %KEY%=HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnceEx
REG ADD %KEY%\009 /ve /D "Reboot.." /f
REG ADD %KEY%\009 /v 1 /D "cmd.exe /c taskkill.exe /f /im rundll32.exe & shutdown /r /t 0 /f" /f
Это может оставить остатки ключей при следующем запуске. Поэтому, чтобы он выглядел чище, добавьте инструкцию по удалению ключа вручную перед тем, как убить и перезагрузить:
set %KEY%=HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnceEx
REG ADD %KEY%\009 /ve /D "Reboot.." /f
REG ADD %KEY%\009 /v 1 /D "cmd.exe /c REG DELETE %key%\009 /va /f & taskkill.exe /f /im rundll32.exe & shutdown /r /t 0 /f" /f
Надеюсь, это поможет.
Edit:
В XP вам, возможно, придется использовать tskill
вместо taskkill
, но принцип тот же.