EdMSL
@EdMSL
Free Developer

Как правильно запустить .bat файл из приложения Electron?

Доброго времени суток. Имеется приложение на Электрон 7.1.9. Хочу реализовать автообновление для приложения, но так как оно портабельное, то стандартный электроновский способ через autoUpdater не подходит (т.к. требуется установка приложения в системе). Решил сделать обновление через распаковку архива после выхода из приложения. Для этого написал .bat со следующим кодом:
@echo off
@cd /d "%~dp0"
timeout /T 5 /NOBREAK
7z x %cd%\update.zip -o..\"" -r -y
del /s /q .\update.zip
start /d %cd%\..\ app.exe
exit

Основная загвоздка в timeout. Пауза нужна для того, чтобы приложение наверняка закрылось и я мог обновить его файлы. Запуск обновления сделан через отправку события на ipc.Main. Сначала пробовал через spawn и exec:
ipcMain.on('update app', () => {
    // Так
    const bat = spawn('cmd.exe', ['/c', Path.LAUNCHER_UPDATER]);
    // И так
    const bat = spawn(Path.LAUNCHER_UPDATER, { cwd: Path.GAME_DIR });
    // И вот так
   const bat = exec(Path.LAUNCHER_UPDATER, { cwd: Path.GAME_DIR });

    bat.stderr.on('data', (data) => {
      app.quit();
    }); 
  });

Но результат примерно одинаков. Если .bat файл и запускается, то может не выполниться до конца, если архив большой, например. Но главное то, что не показывается окно консоли вообще, и нет паузы перед стартом в 5 сек.
Потом я попробовал второй вариант, который нашел здесь, на сайте.
shell.openItem(Path.LAUNCHER_UPDATER);
app.quit();

И здесь все лучше, есть окно консоли, все выполняется правильно, но все равно нет паузы, т.к. пишет timeout invalid time interval '/t'.
Хотя если просто запускать этот .bat из папки, то все работает и пауза есть.
В общем, как заставить эту конструкцию работать?
  • Вопрос задан
  • 128 просмотров
Пригласить эксперта
Ответы на вопрос 1
EdMSL
@EdMSL Автор вопроса
Free Developer
Собственно, проблема решилась сама собой. Ошибка timeout invalid time interval '/t' появлялась, когда пытался запустить батник в режиме разработчика, из папки, отличной от папки проекта. Собранный билд программы все прекрасно запускает, когда все файлы на своих местах, то ошибки нет. Оставил вариант с shell.openItem(Path.LAUNCHER_UPDATER);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы