0

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

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

但是当这个脚本被调用时,它会给出一个错误,“unexpected goto”。

她的剧本是:

@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

请问有人能找出错误吗?

4

1 回答 1

1

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

IF ERRORLEVEL 0 (

这应该永远是真的。if errorlevel n意味着if errorlevel is n OR GREATER THAN n。有一些方法可以将errorlevel设置为负值 - 但正常操作总是会设置一个正的 errorlevel,因此if errorlevel 0应该始终为真。

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

那时,IF %menunr%==1 (goto yesupdate)将被评估为IF ==1 (goto yesupdate)因为menunr是 undefined 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值)之间的区别

还:

如果您只是按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是多余的,但无害)

于 2013-06-10T14:40:28.663 回答