我正在尝试自动更新.bat程序

时间:2011-08-27 22:01:20

标签: batch-file cmd

所以,我现在如何完成它是因为它调用另一个bat文件来更新它,然后该批处理文件更新,并将%ERRORLEVEL%设置为1.在原始程序的开头,它检查errorlevel是否为1,如果是,则进入主菜单,但是现在,它不会调用更新文件,只是进入菜单。这是我的代码

主程序

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

:begin
echo MENU

更新

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 个答案:

答案 0 :(得分:4)

不要使用errorlevel。这是一个内部变量。在批处理开始时,errorlevel将为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

<强>更新

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

因为每次你做任何事情都会覆盖错误级别,所以你会遇到麻烦。将%errorlevel%更改为%error%,它应该可以解决您的问题。因为它是本地环境变量,所以它也应该在批处理文件之间传递。小心不要在其他地方使用错误。

答案 1 :(得分:1)

这是使用Dropbox公共文件夹而没有wget的解决方案。它使用Winhell +机器上的PowerShell。 使用您自己的网址更新以下https://dl.dropboxusercontent.com/u/12345678/网址。

自动创建.conf文件以进行配置。 将drop_box上的文件的__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

答案 2 :(得分:0)

您可以通过以下步骤完成此操作:

1.输出服务器中的两个文件,一个配置文件,一个需要更新的更高版本的bat文件;设置最后版本号。在配置文件中。
2.应在每次启动时检查更新客户端。您可以在服务器配置文件中阅读新闻版本,然后与本地bat文件版本进行比较。如果不相等,那么更新,否则其他明智。

你有什么问题吗?