Я пытаюсь сделать автообновление программы .bat - PullRequest
2 голосов
/ 28 августа 2011

Итак, как я это сделал прямо сейчас, так это то, что он вызывает другой bat-файл для его обновления, а затем этот пакетный файл обновляет и устанавливает% ERRORLEVEL% в 1. В начале исходной программы он проверяет, равен ли уровень ошибки 1, если да, он переходит в главное меню, но сейчас он не вызывает файл обновления, он просто переходит в меню. Это мой код

Основная программа

IF %errorlevel% EQU 1 goto begin
call updater.bat

:begin
echo MENU

Updater

set=errorlevel 1
wget (updatelink here)
call mainprogram.bat

Прямо сейчас, иногда это работает, иногда нет, что заставляет меня поверить, что какая-то команда каким-то образом повышает уровень ошибки, но единственный код перед проверкой уровня ошибки -

@echo off
color 0f
cls
set currentver=v0.5.6
(check code)IF %errorlevel% EQU 1 goto begin 

https://code.google.com/p/flashcart-helper/source/browse/trunk/0.6/FlashcartHelperRobocopy.bat Вот что у меня сейчас.

Ответы [ 3 ]

4 голосов
/ 28 августа 2011

Не балуйтесь с уровнем ошибки. Это внутренняя переменная. В начале пакета уровень ошибки будет равен 0, потому что все, что вы сделали, - это установили локальную переменную. Это почти всегда (никогда не говори никогда) будет успешным. Кроме того, если errorlevel равен 1, и я читаю это правильно, у вас также, кажется, есть бесконечный цикл? Из того, что я понимаю из того, что вы сказали, ваши партии выглядят так:

Главная

@echo off
color 0f
cls
set currentver=v0.5.6
IF %errorlevel% EQU 1 goto begin
call updater.bat

:begin
echo MENU

Updater

set=errorlevel 1
wget (updatelink here)
call mainprogram.bat

Поскольку уровень ошибки get перезаписывается каждый раз, когда вы делаете что-либо, о чем вы просите. Измените %errorlevel% на %error%, и это должно решить ваши проблемы. Поскольку это локальная переменная среды, она также должна передаваться между пакетными файлами. Просто будьте осторожны, чтобы не использовать ошибку в другом месте.

1 голос
/ 17 мая 2015

Вот решение с использованием общедоступных папок Dropbox и без wget.Он использует PowerShell, что на машинах Win7 +.Обновите приведенный ниже https://dl.dropboxusercontent.com/u/12345678/ url своим собственным.

Он автоматически создает файл .conf для конфигурации.Установите для __deploy_mode значение 1 для файла в раскрывающемся окне, чтобы файл версии можно было обновить, но сценарий не был выполнен случайно.

  @ECHO OFF
  SETLOCAL ENABLEDELAYEDEXPANSION

  SET time_start=%time%
  SET time_choice_wait=20
  SET script_ver=1.00
  SET script_name=%~n0
  SET server_url=https://dl.dropboxusercontent.com/u/12345678/

  SET script_name_bat=%~dp0%script_name%.bat
  SET script_name_cfg=%~dp0%script_name%.conf
  SET script_name_latest_ver=%~dp0%script_name%.latest.ver

  ECHO %script_name% v%script_ver%
  ECHO %script_ver% > %script_name%.current.ver

  IF NOT EXIST "%script_name_cfg%" CALL :SCRIPT_MISSING_CFG
  FOR /f "delims=" %%x IN (%script_name%.conf) DO (SET "%%x")
  IF %__deploy_mode% EQU 1 GOTO :EOF
  IF %auto_update_compare% EQU 1 CALL :SCRIPT_COMPARE_VER




  :SCRIPT_MAIN
  REM =======================================
  REM ===       EDIT BELOW THIS LINE       ==

  REM TODO Add main content
  ECHO.
  ECHO Waiting for content...

  REM ===       EDIT ABOVE THIS LINE       ==
  REM =======================================
  GOTO END




  :SCRIPT_MISSING_CFG
  ECHO Creating new %script_name%.conf file...
  ECHO __deploy_mode=0                   > "%script_name_cfg%"
  ECHO repository_base_url=%server_url% >> "%script_name_cfg%"
  ECHO auto_update_compare=1                >> "%script_name_cfg%"
  ECHO auto_update_download=1               >> "%script_name_cfg%"
  ECHO Update %script_name%.conf as needed, then save and close to continue.
  ECHO Waiting for notepad to close...
  NOTEPAD "%script_name_cfg%"
  GOTO :EOF




  :SCRIPT_COMPARE_VER
  ECHO Please wait while script versions are compared...
  Powershell -command "& { (New-Object Net.WebClient).DownloadFile('%server_url%%script_name%.current.ver', '%script_name_latest_ver%') }"
  IF NOT EXIST "%script_name_latest_ver%" GOTO END
  SET /p script_latest_ver= < "%script_name_latest_ver%"
  IF %script_ver% EQU %script_latest_ver% CALL :SCRIPT_COMPARE_VER_SAME
  IF %script_ver% NEQ %script_latest_ver% CALL :SCRIPT_COMPARE_VER_DIFF
  GOTO :EOF

  :SCRIPT_COMPARE_VER_SAME
  ECHO Versions are both %script_name% v%script_ver%
  GOTO :EOF

  :SCRIPT_COMPARE_VER_DIFF
  ECHO Current Version:%script_ver% ^| Server Version:%script_latest_ver%
  IF %auto_update_download% EQU 1 GOTO SCRIPT_DOWNLOAD_SCRIPT
  ECHO.
  ECHO Would you like to download the latest %script_name% v%script_latest_ver%?
  ECHO Defaulting to N in %time_choice_wait% seconds...
  CHOICE /C YN /T %time_choice_wait% /D N
  IF ERRORLEVEL 2 GOTO SCRIPT_DOWNLOAD_NOTHING
  IF ERRORLEVEL 1 GOTO SCRIPT_DOWNLOAD_SCRIPT
  IF ERRORLEVEL 0 GOTO SCRIPT_DOWNLOAD_NOTHING

  :SCRIPT_DOWNLOAD_SCRIPT
  ECHO Please wait while script downloads...
  Powershell -command "& { (New-Object Net.WebClient).DownloadFile('%server_url%%script_name%.bat', '%script_name_bat%') }"
  ECHO Script Updated to v%script_latest_ver%^^!
  REM User must exit script. Current batch is stale.
  GOTO :END

  :SCRIPT_DOWNLOAD_NOTHING
  GOTO :EOF



  :END
  SET time_end=%time%
  ECHO.
  ECHO Script started:%time_start%
  ECHO Script ended  :%time_end%
  :END_AGAIN
  pause
  ECHO.
  ECHO Please close this window
  ECHO.
  GOTO END_AGAIN
0 голосов
/ 28 апреля 2016

Вы можете сделать это с помощью этих шагов:

1. введите два файла на сервер, файл конфигурации, файл bat более высокой версии, который необходимо обновить;установить последнюю версию номер.в конфигурационном файле.
2.client bat следует проверять обновление при каждом запуске.Вы можете прочитать версию новостей в конфигурационном файле сервера, а затем сравнить с локальной версией файла bat.если не равно, так что обновите, иначе другое.

Есть ли у вас проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...