我正在尝试制作一个批处理脚本来保存射箭的分数。 当我运行它并为第1,第2和第3箭头输入分数1,2和3时,我的预期输出是:
Scores:
1st arrow: 1
2nd arrow: 2
3rd arrow: 3
-
Total score: 6
Maximum possible score: 15
Accuracy: 40%
相反,我得到输出:
Scores:
1st arrow:
2nd arrow:
3rd arrow:
-
Total score: 6
Maximum possible score: 15
Accuracy:
代码:
@echo off
color 0f
title Archery Score Logger
:askForConfig
set configFile=defaultConfig.cfg
cls
echo What config file would you like to use?
echo Leave blank for default config.
set /p configFile=Input:
if exist %configFile% (
goto loadConfig
) else (
echo Error!
echo The specified file does not exist.
pause
goto askForConfig
)
:loadConfig
(
set /p colour=
set /p numOfArrows=
set /p maxScorePerArrow=
)<%configFile%
color %colour%
:mainMenu
cls
echo Main Menu
echo -
echo 1 to input scores
echo 2 to exit
echo -
set /p menuChoice=Input:
if %menuChoice% == 1 (
set arrowInputCount=1
set totalScore=0
set numOfXs=0
cls
goto inputScores
) else if %menuChoice% == 2 (
exit
)
:inputScores
cls
if %arrowInputCount% gtr %numOfArrows% (
echo Done!
pause
goto output
)
set suffix=th
if %arrowInputCount% equ 1 (
set suffix=st
) else if %arrowInputCount% equ 2 (
set suffix=nd
) else if %arrowInputCount% equ 3 (
set suffix=rd
)
echo Input the score for the %arrowInputCount%%suffix% arrow ^(%numOfArrows% total arrows^).
echo Range: ^(1-%maxScorePerArrow%^), 'm' for miss, 'x' for an x.
set /p arrow[arrowInputCount]=Input:
if %arrow[arrowInputCount]% geq 1 (
if %arrow[arrowInputCount]% leq %maxScorePerArrow% (
set /a totalScore+=%arrow[arrowInputCount]%
set /a arrowInputCount+=1
goto inputScores
)
) else if %arrow[arrowInputCount]% == m (
set /a arrowInputCount+=1
goto inputScores
) else if %arrow[arrowInputCount]% == x (
set /a totalScore+=%maxScorePerArrow%
set /a arrowInputCount+=1
goto inputScores
)
echo Error!
echo The value you entered was invalid.
pause
goto inputScores
:output
set /a maxPossibleScore=%numOfArrows%*%maxScorePerArrow%
set /a accuracy=%totalScore%/(%maxPossibleScore%/100)
set outputCount=1
cls
echo Scores:
:outputLoop
set suffix=th
if %outputCount% equ 1 (
set suffix=st
) else if %outputCount% equ 2 (
set suffix=nd
) else if %outputCount% equ 3 (
set suffix=rd
)
if %outputCount% leq %numOfArrows% (
echo %outputCount%%suffix% arrow: %arrow[outputCount]%
set /a outputCount+=1
goto outputLoop
)
echo -
echo Total score: %totalScore%
echo Maximum possible score: %maxPossibleScore%
echo Accuracy: %accuracy%^%
echo -
pause
exit
我认为问题在于数组,但在阅读完它们后,我仍然看不到我的代码有问题。 我看到了一些类似的问题,他们通过添加一行说明来修复它:
setlocal EnableDelayedExpansion
但我尝试在@echo关闭后在程序开始时添加它并且它什么都没改变。 程序为config导入的值位于名为“defaultConfig.cfg”的文件中,该文件显示为:
0f
3
5
答案 0 :(得分:0)
请再次阅读delayedexpansion
要通过计算的索引获取数组var的内容,您需要延迟扩展。
使用时。
if %arrow[arrowInputCount]% geq 1
这只是一个简单的var,恰好在名称中有一些括号
如果您已经发出Setlocal EnableDelayedExpansion
if !arrow[%arrowInpuCount%]! geq 1
会起作用。
但在代码块中你需要另一级延迟扩展。
对于echo和set命令,您可以使用伪调用,但这不适用于if。
解决方法强>:
(
call Set temp=%%arrow[!arrowInpuCount!]%%
If !temp! geq 1 .....
)
所以你首先必须得到一个临时变量来与if进行比较。