如何在批处理脚本中使用数组?

时间:2017-08-26 10:35:14

标签: arrays batch-file

我正在尝试制作一个批处理脚本来保存射箭的分数。 当我运行它并为第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

1 个答案:

答案 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进行比较。