我正在尝试创建一个从另一个脚本调用的脚本来更新他......
此脚本通过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
有人能找到错误吗?
答案 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
周围的括号是多余的,但无害)