Batch file 在当时,获得goto是出人意料的

Batch file 在当时,获得goto是出人意料的,batch-file,Batch File,我目前正在制作一个游戏,里面有一个说服系统。我已经设置了其中一个系统的所有代码,但后来我又设置了2个,它开始给我一个错误,说“这个数字在这个时候是不应该的”。当我在第二个选项中输入2,在第三个选项中输入3 代码是这样的 @echo off SETLOCAL EnableDelayedExpansion for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"')

我目前正在制作一个游戏,里面有一个说服系统。我已经设置了其中一个系统的所有代码,但后来我又设置了2个,它开始给我一个错误,说“这个数字在这个时候是不应该的”。当我在第二个选项中输入2,在第三个选项中输入3

代码是这样的

@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"

)
set name=Quantum

cls 

color 0a

Echo King Redwood: So 2000?

pause >nul

echo.

call :colorText 09 "1. 2500"

echo.

call :colorText 0e "2. 3000"
echo.
call :colorText 0c "3. 4000"
echo.
echo 4. 2000
echo.
set /p "purs=Enter:"
if /i %purs% == 1 ( 
goto CheckB )
if /i %purs% == 2 ( 
goto CheckY )
if /i %purs% == 3 (
goto CheckR )
if /i %purs% == 4 ( 
goto Convo )


:CheckB
set bleu=%random:~-2,1%
if %bleu% GTR 10 (
goto CheckB )
if %bleu% LSS 0 (
goto CheckB )
set /a  num = 3
set /a  reward = 2500
goto Res
:CheckY
set Yel=%random:~-2,1%
if %Yel% GTR 10 (
goto CheckY )
if %Yel% LSS 0 (
goto CheckY )
set /a num = 5
set reward = 3000
goto Res

:CheckR
set red=%random:~-2,1%
if %red% GTR 10 (
goto CheckB )
if %red% LSS 0 (
goto CheckB )
set /a num = 7
set /a reward = 4000
goto Res

:Convo
set /a reward = 2000
Echo %name%: I think that is a reasonable price.
Echo King Redwood: Very well.
Echo King Redwood: We will now take you to make sure you are
echo ready.
pause >nul


:Res
if %bleu% GEQ %num% goto Succeed
if NOT %bleu% GEQ %num% goto Fail

:Succeed
Echo %name%: I think that the struggles for such a long trip will be more then that
Echo %name%: How about %reward%? 
Echo King Redwod: OK %reward% will work.
pause >nul 
goto end

:Fail
Echo %name%: I think that you can give me %reward%.
Echo %name%: You know, for the struggles that there will be along the way.
echo If 2000 isn't good enough for you, I'll just have someone else do it.
pause >nul

:end
exit


:colorText
echo off
<nul set /p ".=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1i
SET /a red=%random% %% 11
@echo关闭
SETLOCAL EnableDelayedExpansion
对于/F“tokens=1,2 delims=#”%%a in(‘“prompt#$H#$E#&echo on&for%%b in(1)do rem“’)do(
设置“DEL=%%a”
)
set name=Quantum
cls
颜色0a
回声王红杉:那么2000年呢?
暂停>nul
回声。
电话:colorText 09“1.2500”
回声。
呼叫:colorText 0e“2.3000”
回声。
调用:colorText 0c“3.4000”
回声。
回声4。2000
回声。
设置/p“purs=输入:”
如果/i%purs%==1(
转到检查(B)
如果/i%purs%==2(
转到CheckY)
如果/i%purs%==3(
跳棋(跳棋)
如果/i%purs%==4(
后藤护卫队)
:检查
设置bleu=%random:~-2,1%
如果%bleu%GTR 10(
转到检查(B)
如果%bleu%LSS 0(
转到检查(B)
set/a num=3
设置/奖励=2500
后藤酒店
:方格
设置Yel=%random:~-2,1%
如果%Yel%GTR 10(
转到CheckY)
如果%Yel%LSS 0(
转到CheckY)
设置/a num=5
设定奖励=3000
后藤酒店
:CheckR
设置红色=%random:~-2,1%
如果%red%GTR 10(
转到检查(B)
如果%red%LSS为0(
转到检查(B)
设置/a num=7
设置/奖励=4000
后藤酒店
:车队
设置/奖励=2000
Echo%name%:我认为这是一个合理的价格。
回声王:很好。
回声王红杉:我们现在会带你去确认你的身份
回声准备好了。
暂停>nul
:Res
如果%bleu%GEQ%num%goto成功
如果不是%bleu%GEQ%num%goto失败
:成功
Echo%name%:我认为这么长一段旅程的奋斗将不止于此
回显%name%:那么%reward%呢?
回声王雷德沃德:好的%奖励%将起作用。
暂停>nul
转到终点
:失败
Echo%name%:我想你可以给我%的奖励。
Echo%name%:你知道,为了一路走来的奋斗。
如果2000对你来说不够好,我就让别人来做。
暂停>nul
:结束
出口
:彩色文本
回音
"%~2"
findstr/v/a:%1/R“^$”“%~2”个
删除“%~2”>nul 2>&1i

首先,确保在:check b之前加上a)以关闭FOR循环

对于“此时不应出现”错误,您有时会将空变量与其他变量进行比较。例如,通过执行CheckY,设置Yel,然后继续执行Res并检查Bleu,Bleu为空,因为它尚未设置。你没有把任何东西放在二进制GEQ操作符旁边,这就是它抱怨的原因

提示:要进行调试,请尝试插入如下ECHO语句:

:Res
echo bleu=%bleu%,num=%num%
另一个问题:使用SET时,不要用空格包围=
SET/a
将使用=(正是因为/a的性质)周围的空格,但普通集合不会。它会在变量名后面加一个空格,然后在值前面加一个空格,这不是你想要的

另一个提示:您可以通过SET/a和模运算符约束随机返回的内容,如下所示

@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"

)
set name=Quantum

cls 

color 0a

Echo King Redwood: So 2000?

pause >nul

echo.

call :colorText 09 "1. 2500"

echo.

call :colorText 0e "2. 3000"
echo.
call :colorText 0c "3. 4000"
echo.
echo 4. 2000
echo.
set /p "purs=Enter:"
if /i %purs% == 1 ( 
goto CheckB )
if /i %purs% == 2 ( 
goto CheckY )
if /i %purs% == 3 (
goto CheckR )
if /i %purs% == 4 ( 
goto Convo )


:CheckB
set bleu=%random:~-2,1%
if %bleu% GTR 10 (
goto CheckB )
if %bleu% LSS 0 (
goto CheckB )
set /a  num = 3
set /a  reward = 2500
goto Res
:CheckY
set Yel=%random:~-2,1%
if %Yel% GTR 10 (
goto CheckY )
if %Yel% LSS 0 (
goto CheckY )
set /a num = 5
set reward = 3000
goto Res

:CheckR
set red=%random:~-2,1%
if %red% GTR 10 (
goto CheckB )
if %red% LSS 0 (
goto CheckB )
set /a num = 7
set /a reward = 4000
goto Res

:Convo
set /a reward = 2000
Echo %name%: I think that is a reasonable price.
Echo King Redwood: Very well.
Echo King Redwood: We will now take you to make sure you are
echo ready.
pause >nul


:Res
if %bleu% GEQ %num% goto Succeed
if NOT %bleu% GEQ %num% goto Fail

:Succeed
Echo %name%: I think that the struggles for such a long trip will be more then that
Echo %name%: How about %reward%? 
Echo King Redwod: OK %reward% will work.
pause >nul 
goto end

:Fail
Echo %name%: I think that you can give me %reward%.
Echo %name%: You know, for the struggles that there will be along the way.
echo If 2000 isn't good enough for you, I'll just have someone else do it.
pause >nul

:end
exit


:colorText
echo off
<nul set /p ".=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1i
SET /a red=%random% %% 11
这会将红色设置为0到10之间的数字,因此在选择随机数后不需要使用子字符串和转到例程


也可以考虑使用<代码>退出/b>代码>退出批处理文件,而不是整个CMD环境。

我做了一个编辑,我改变了集合num并设置了下面的奖励:但这仍然给了我一个错误。注释掉
@echo off
,看看实际发生了什么;不要双击批处理文件,而是通过打开命令提示窗口并键入其路径来运行批处理文件…例如,
%bleu%
:res
下是一个空字符串,因为
bleu
没有经过
:CheckY
:CheckR
:conva
设置(此列表可能不完整)。因此,
if%bleu%GEQ%num%goto success
的结果类似于
if GEQ 3 goto success
…显然是错误的语法…我尝试将%bleu%和所有其他变量更改为类似颜色的值,以便在所有方面都相同,但我仍然遇到相同的问题。但现在我明白了,此时0是意外的@JosefZFirst,的
循环体已经被
括号关闭,就在
set name=Quantum
之前。谢谢。这对我帮助很大@大豆。