2017-08-26 5 views
0

私はアーチェリーで得点を保持するバッチスクリプトを作ろうとしています。 私はそれを実行し、スコア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後にプログラムの開始時に、それを追加しようと、それは何も変わっていない: 私は、彼らが言うの行を追加して、それを修正し、いくつかの同様の問題を見ました。設定のためのプログラムの輸入は読み込み「defaultConfig.cfg」と呼ばれるファイルにあり 値:

0f 
3 
5 
+0

すべてのアレイ管理の詳細については、[配列、リンクリスト、およびcmd.exe(バッチ)スクリプトのその他のデータ構造](https://stackoverflow.com/questions/10166386/arrays-linked-lists-and-他のデータ構造のcmd-exe-batchスクリプト/ 10167990#10167990) – Aacini

答えて

0

言うアサーションインデックスを経由して、配列VARのコンテンツを取得するにはdelayedexpansion

にもう一度お読みください遅延展開が必要です。

使用する場合。

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 ..... 
) 

ですから、最初の場合と比較するための一時的な変数を取得する必要があります。

関連する問題