0

したがって、このコードにはいくつかの問題があります。おそらく、まだ気付いていない句読点エラーですが、何らかの理由で見つけることができません。

これがループを行う方法であると読んだDo後、回数、この場合は「%dmg%」、これが真実でないかどうか教えてください。

変数を定義する部分があります。 set dmgt=0 set /a wl=1000*%upts%/%epts%そして、私は他のすべてを設定しています。

一時停止コマンドを使用すると、これが問題であることがわかりました。

if %upts%*%utroop% LEQ %epts%*%etroopt% ( goto fail
) else ( set /a dmg=%wl%*%etroop%/1000
    set /a dmgt=%dmg%+%dmgt%
do %dmg%
SET /A type=%RANDOM% * 3 / 32768 + 1
if %type% == 1 ( if %snip% GEQ 1 ( set /a dmg=%dmg%-1
        set /a snip=%snip%-1
    )
)
if %type% == 2 ( if %mgs% GEQ 1 ( set /a dmg=%dmg%-2
        set /a mgs=%mgs%-1
    )
)
if %type% == 3 ( if %rif% GEQ 1 ( set /a dmg=%dmg%-1
        set /a rif=%rif%-1
    )
)
enddo
)
4

1 に答える 1

0

if %upts%*%utroop% LEQ %epts%*%etroopt%各辺の値を計算するのではなく、文字列をthe contants of upts*合わせthe contents of utroopて、その文字列を RHS と比較します。を使用して、2 つの値を変数に明示的に計算する必要がありますSET

あなたのELSE句は「ブロックステートメント」を呼び出します。つまり、括弧で囲まれた一連のステートメントの完全な内容であり、)次の終了までenddoです。バッチはステートメントをブロックIFの閉じ括弧まで解析し、PARSE-TIME の値でELSEany を置換し、THENは結果を実行します。したがって、ブロック内のロジックには変更されないように見えます。%var%varTYPE

の RUN-TIME 値にアクセスするには、delayedexpansionモードを呼び出して使用する必要があります。これはステートメントで行われ、通常はバッチの開始時に開始された後に挿入されます(したがって、バッチの全期間にわたって遅延拡張と機能をオンにします)。!var!varSETLOCAL ENABLEDELAYEDEXPANSION@echo off!var!

実際には、本当の部分にラベルを付けELSEているので、句は必要ありません。GOTOこれにより、コードが簡素化される場合があります。

最後に、DO/ENDDOバッチには機能がありません。少なくとも、その形式には機能がありません。その間のコード時間を実行するつもりだと思います%dmg%。を使用してこれを達成できます

for /L %%z in (1,1,%dmg%) do (
 intervening code
)

ここで、メタ変数%%zは、括弧内の最初の要素から最後の要素まで 2 番目のステップでインクリメントされます。任意の文字にすることができますが、バッチで大文字と小文字を区別する%%z数少ないケースの 1 つです。

于 2013-12-22T08:36:42.377 に答える