所以我有一个脚本,我正在写作一个宠物项目,似乎比原来简单...我有一个for循环,意味着根据用户输入增加一定的次数,但在for循环,我在脚本中有一个goto的目标语句。问题是,当使用goto时,它会中断for并导致for循环仅提供1个答案。
以下是代码:
for /l %%x in (1, 1, %player%) do (
:defense
call :defenders
:defense_return
call :colorEcho 0e %operator%
echo.
)
:defense_return是罪魁祸首,但它是必要的,因为我使用%RANDOM%所以我需要它来引用回%RANDOM%时使用,否则我只是得到相同的输出,当我真的想要2个不同的输出
这是防御者阻止:
:defenders
set /a operator=%random%%%18+1
REM 707th SMB
if %operator%== 1 set operator=Vigil
REM G.R.O.M
if %operator%== 2 set operator=Ela
REM S.D.U
if %operator%== 3 set operator=Lesion
REM G.E.O
if %operator%== 4 set operator=Mira
REM S.A.T
if %operator%== 5 set operator=Echo
REM BOPE
if %operator%== 6 set operator=Caviera
REM Navy Seal
if %operator%== 7 set operator=Valkyrie
REM JTF2
if %operator%== 8 set operator=Frost
REM S.A.S
if %operator%== 9 set operator=Mute
if %operator%== 10 set operator=Smoke
REM SWAT
if %operator%== 11 set operator=Castle
if %operator%== 12 set operator=Pulse
REM GIGN
if %operator%== 13 set operator=Doc
if %operator%== 14 set operator=Rook
REM GSG9
if %operator%== 15 set operator=Jager
if %operator%== 16 set operator=Bandit
REM Spetsnaz
if %operator%== 17 set operator=Tachanka
if %operator%== 18 set operator=Kapkan
goto :defense_return
我真的想让这个脚本工作,但这个for循环导致我的问题...非常感谢任何帮助!
答案 0 :(得分:2)
你在这里有一个误解,正如评论中所解释的那样......
:defenders
块是子程序,即您要调用的代码段(或调用,或执行,或其中任何一个)当这样的代码段结束时,您希望不“引用”(转到)另一个地方,但要返回到达这样一个子程序的地步。返回call
命令后面的命令的方法是exit /B
,尽管goto :EOF
也可以用于此目的,但它更令人困惑(在大多数编程语言中,用于执行此操作的语句称为return
)。
此外,当您想要使用变更 for
循环的变量值时,您必须使用!variable!
结构而不是%variable%
一个(并在程序开头插入setlocal EnableDelayedExpansion
命令)。
最后,如果您使用array,则可能会改进您的代码。这是包含所有先前描述的修改后代码的最终版本:
@echo off
setlocal EnableDelayedExpansion
rem Initialize "operator" array
set i=0
for %%a in (Vigil Ela Lesion Mira Echo Caviera Valkyrie Frost Mute
Smoke Castle Pulse Doc Rook Jager Bandit Tachanka Kapkan) do (
set /A i+=1
set operator[!i!]=%%a
)
rem Get a Back-Space (ASCII 8) character (for :colorEcho routine)
for /F %%a in ('echo prompt $H ^| cmd') do set "BS=%%a"
set player=4
for /l %%x in (1, 1, %player%) do (
call :defenders
call :colorEcho 0e !operator!
echo/
)
pause
goto :EOF
:defenders
set /a operator=%random%%%18+1
set operator=!operator[%operator%]!
exit /B
:colorEcho color text
set /P "=%BS% " > "%~2" <nul
findstr /A:%1 "^" "%~2" nul
del "%~2"
exit /B
答案 1 :(得分:1)
如上所述,您需要正确退出CALL并使用延迟扩展。
@echo off
setlocal EnableDelayedExpansion
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
set "DEL=%%a"
)
for /l %%x in (1,1,2) do (
call :defenders
call :colorEcho 0E !operator!
echo.
)
pause
GOTO :EOF
:defenders
set /a operator=%random%%%18+1
REM 707th SMB
if %operator%== 1 set operator=Vigil
REM G.R.O.M
if %operator%== 2 set operator=Ela
REM S.D.U
if %operator%== 3 set operator=Lesion
REM G.E.O
if %operator%== 4 set operator=Mira
REM S.A.T
if %operator%== 5 set operator=Echo
REM BOPE
if %operator%== 6 set operator=Caviera
REM Navy Seal
if %operator%== 7 set operator=Valkyrie
REM JTF2
if %operator%== 8 set operator=Frost
REM S.A.S
if %operator%== 9 set operator=Mute
if %operator%== 10 set operator=Smoke
REM SWAT
if %operator%== 11 set operator=Castle
if %operator%== 12 set operator=Pulse
REM GIGN
if %operator%== 13 set operator=Doc
if %operator%== 14 set operator=Rook
REM GSG9
if %operator%== 15 set operator=Jager
if %operator%== 16 set operator=Bandit
REM Spetsnaz
if %operator%== 17 set operator=Tachanka
if %operator%== 18 set operator=Kapkan
goto :eof
:colorEcho
<nul set /p ".=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1
goto :eof