批处理脚本更新脚本时出错,任何人都可以找到错误吗?

时间:2013-06-10 13:22:17

标签: batch-file batch-updates

我正在尝试创建一个从另一个脚本调用的脚本来更新他......

此脚本通过wget从服务器下载,并由其他脚本启动。它检查RunToolkit的版本,如果不是v1.1,则下载新版本......

但是当调用这个脚本时,它会给出一个错误,“意外的转到”。

她是剧本:

@echo off
echo Latest version is 1.1

:restart
IF EXIST RunToolkit.exe (
      FIND /I "1.1" "RunToolkit.exe" > NUL:
              IF ERRORLEVEL 0 (
              ECHO Your toolkit version is 1.1
              echo No updates available!
              PAUSE
              goto quit
              ) ELSE (
              ECHO Your toolkit is outdated, do you want to update it?
              ECHO.
              ECHO 1. Yes
              ECHO 2. No
              ECHO.
              SET /P menunr=Select number you want :
              IF %menunr%==1 (goto yesupdate)
              IF %menunr%==2 (goto quit)
              goto what
              )
)

:yesupdate
echo Downloading new version!
wget (link deleted for privacy :P)

:what
echo.
echo You entered a wrong number! Retry!
PAUSE
goto restart

:quit
call RunToolkit.exe

有人能找到错误吗?

1 个答案:

答案 0 :(得分:1)

第一个问题,与您的错误无关是

IF ERRORLEVEL 0 (

哪个应该是真的。 if errorlevel n表示if errorlevel is n OR GREATER THAN n。有 ARE 设置errorlevel否定的方法 - 但正常操作总是会设置一个正误差级别,因此if errorlevel 0应始终为真。

您的下一个问题是CMD始终将current值替换为任何逻辑行中的任何%var%,然后验证该行。这里的逻辑行从IF EXIST开始,一直到第一列中的单个右括号 - 后面的18个物理行。

届时,IF %menunr%==1 (goto yesupdate)将被评估为IF ==1 (goto yesupdate),因为menunr未定义WHEN THE LINE WAS PARSED。这是UNEXPECTED GOTO

的来源

由于您要输入memunr,您需要了解delayedexpansion - 这是一个演示:

@echo off
SETLOCAL
cls
set var=ORIGINAL
echo Start value of var=%var%
for %%i in (1) do (SET var=AFTER
ECHO var is %var% in the for loop
)
echo Final value of var=%var%
ENDLOCAL
ECHO.
echo ---- try again with ENABLEDELAYEDEXPANSION
ECHO. 
setlocal enabledelayedexpansion
set var=ORIGINAL
echo Start value of var=%var%
for %%i in (1) do (SET var=AFTER
ECHO var is %var% not !var! in the for loop
ECHO Note: in the loop VAR has old value %var% and new value !var!
)
echo Final value of var=%var%
endlocal

请注意%var%PARSE-TIME值)和!var!RUN-TIME值)之间的差异

ALSO:

如果您只是按ENTER作为对SET /P menunr=Select number you want :的回复,那么menunr将保持不变。由于它没有任何价值,因此它仍然没有价值,因此,如果您通过delayedexpansion语句启用setlocal enabledelayedexpansion,则逻辑更改

IF %menunr%==1 (goto yesupdate)


IF !menunr!==1 (goto yesupdate)

也会遭遇同样的错误。

您需要使用

IF "!menunr!"=="1" (goto yesupdate)

以迎合空变量的情况。

(另外:GOTO周围的括号是多余的,但无害)