Доброго времени суток. Имеется приложение на Электрон 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 из папки, то все работает и пауза есть.
В общем, как заставить эту конструкцию работать?