Estoy intentando hacer un programa .bat de actualización automática

Entonces, cómo lo hice ahora, es que llama a otro archivo bat para actualizarlo, y luego ese archivo por lotes se actualiza y establece% ERRORLEVEL% en 1. Al comienzo del programa original, verifica si el nivel de error es 1, si es así, va al menú principal, pero ahora mismo, no llama al archivo de actualización, simplemente va al menú. Este es mi codigo

Programa principal

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

:begin
echo MENU

Updater

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

En este momento, a veces funciona, a veces no, lo que me lleva a creer que algún comando está aumentando de alguna manera el nivel de error, pero el único código antes de la verificación del nivel de error es

@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 Esto es lo que tengo ahora.

preguntado el 27 de agosto de 11 a las 22:08

¿Puedes pegar un ejemplo de trabajo por favor? -

¿Puede proporcionar una explicación de lo que está tratando de lograr? (Estás haciendo un mal uso de ERRORLEVEL en los fragmentos anteriores; no estableces ERRORLEVEL directamente. ERRORLEVEL tiene como objetivo reflejar el éxito o el fracaso de los programas en tu archivo por lotes. Por ejemplo, si tu "wget" fallara, se establecería el ERRORLEVEL, que luego podría probar usando algo como IF ERRORLEVEL 1 hacer algo.) -

Parece que no está dando la imagen completa ... necesitamos más código ... porque parece muy incompleto. ¿Por qué configurar currentver? No se usa en ninguna otra parte de este código. ¿Por qué cambiar manualmente la variable de entorno% errorlevel%? No es bueno hacer. -

3 Respuestas

No juegues con el nivel de error. Es una variable interna. Al comienzo de un lote, el nivel de error será 0 porque todo lo que ha hecho es establecer una variable local. Esto casi siempre (nunca digas nunca) tendrá éxito. Además, si el nivel de error es 1, y estoy leyendo esto correctamente, ¿también parece tener un bucle infinito? Por lo que entiendo de lo que ha dicho, sus lotes son así:

Inicio

@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

Como el nivel de error se sobrescribe cada vez que haces algo, estás buscando problemas. Cambio %errorlevel% a %error% y debería resolver tus problemas. Como es una variable de entorno local, también debe pasarse entre archivos por lotes. Solo tenga cuidado de no usar errores en otros lugares.

Respondido 28 ago 11, 02:08

+1: acordó cambiar manualmente% errorlevel% dentro de los scripts por lotes. Es una mala práctica porque muchos comandos hacen eco de un% errorlevel% después del procesamiento. Por lo tanto, es posible que un comando cambie esa variable sin que el usuario lo sepa. - Anthony Miller

Intenté eso, eso significaba que tenía que establecer un error al comienzo del archivo, por lo que cuando el actualizador vuelve a llamar, se vuelve a cambiar y simplemente entra en un bucle. Esta es la fuente de mi código con el código de actualización automática todavía en él. code.google.com/p/flashcart-helper/source/browse/trunk/0.6/… - ron975

No puedo ver ese enlace; pero si establece% error% o lo que sea que decida llamarlo en la parte superior de su lote principal, irá a 0, irá al actualizador cada vez. - Ben

Aquí hay una solución que usa carpetas públicas de Dropbox y no wget. Utiliza PowerShell en máquinas Win7 +. Actualiza lo siguiente https://dl.dropboxusercontent.com/u/12345678/ url con la tuya.

Crea automáticamente un archivo .conf para la configuración. Establezca __deploy_mode en 1 para el archivo en Dropbox para que el archivo de versión se pueda actualizar pero la secuencia de comandos no se ejecute accidentalmente.

  @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

contestado el 17 de mayo de 15 a las 17:05

Puede hacerlo a través de estos pasos:

1.Ponga dos archivos en el servidor, un archivo de configuración, un archivo bat de versión superior que necesita actualizar; establecer la última versión num. en el archivo de configuración.
2.client bat debe comprobarse la actualización en cada momento de inicio. puede leer la versión de noticias en el archivo de configuración del servidor y luego compararla con la versión del archivo bat local. si no es igual, actualice, de lo contrario.

¿Tienes algun problema?

Respondido 28 Abr '16, 16:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.