2017-08-26 62 views
0

我想制作一个批处理脚本来保存射箭中的分数。 当我运行它,并输入分数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在程序开始加入其关闭,它什么也没有改变。

0f 
3 
5 
+0

所有数组管理细节都在[数组,链表和其他数据结构中的cmd.exe(批处理)脚本]中进行了详细说明(https://stackoverflow.com/questions/10166386/arrays-linked-lists-and-其他数据结构 - 在-CMD-EXE分批脚本/ 10167990#10167990) – Aacini

回答

0

delayedexpansion

再次读取要通过计算方法为指标得到一个数组的VAR的内容: ,该计划进口的配置是在一个名为“defaultConfig.cfg”文件,该文件读取值你需要延迟扩展。

当您使用。

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比较。