2

すぐに助けが必要です。これは大学のプログラムです。:forLoop メソッドを呼び出して、1 から始まり 1 から 100 まで 100 個の数値 (1,1,100) を反復し、% 5 (i%%5) の反復を実行する場合を除いて、すべて正常に動作しています。何らかの理由でこれを機能させることができません。助けや指示に感謝します。

%%A をエコーすると、すべての完全数が繰り返されます。%result% をエコーすると、空白の "" (何も入っていない) が表示されます。

:forLoop
FOR /L %%A IN (1,1,100) DO (
set /A result=%%A %% 2
echo "%%A"
echo "%result%"
)

正しいコードは

:forLoop
setlocal ENABLEDELAYEDEXPANSION
FOR /L %%A IN (1,1,100) DO (
set /A result=%%A %% 5
echo !result! >> results.txt
set /A total=!total!+!result!
echo !total!
)
4

1 に答える 1

2

問題は%result%、 が読み取られるときに が置換forされることです。つまり、ループが実行されると変数ではなくなります。必要なのは、遅延変数展開を有効にしてから!代わりに使用することです%:

setlocal ENABLEDELAYEDEXPANSION

:forLoop
FOR /L %%A IN (1,1,100) DO (
set /A result=%%A %% 5
echo "%%A"
echo !result!
)

これはすべて、実行時に表示されるヘルプ メッセージで説明されていますSET /?

遅延環境変数展開は、回避するのに役立ちます
線を引いたときに発生する現在の拡張の制限
実行時ではなく、テキストの読み取り。次の例
即時変数展開の問題を示します。

    VAR=前に設定
    if "%VAR%" == "before" (
        VAR=after に設定
        if "%VAR%" == "after" @echo これが表示されれば、うまくいきました
    )

%VAR% は両方の IF ステートメントに含まれているため、メッセージは表示されません。
最初の IF ステートメントが読み取られるときに置換されます。
複合ステートメントである IF の本体が含まれます。だから、
複合ステートメント内の IF は、実際には「前」と「前」を比較しています
「後」は決して等しくなりません。同様に、次の例
期待どおりに動作しません:

    リストを設定=
    for %i in (*) do set LIST=%LIST% %i
    %LIST% をエコー

現在のディレクトリにファイルのリストを作成しないという点で、
代わりに、LIST 変数を最後に見つかったファイルに設定します。
繰り返しますが、これは %LIST% が一度だけ展開されるためです。
FOR ステートメントが読み取られ、その時点で LIST 変数は空です。
したがって、実行している実際の FOR ループは次のとおりです。

    for %i in (*) do set LIST= %i

LIST を最後に見つかったファイルに設定し続けるだけです。

遅延環境変数展開により、別の環境変数を使用できます
環境変数を展開する文字 (感嘆符)
実行時間。遅延変数展開が有効な場合、上記
意図したとおりに動作するように、例を次のように記述できます。

    VAR=前に設定
    if "%VAR%" == "before" (
        VAR=after に設定
        もし "!VAR!" == "after" @echo これが表示されれば、うまくいきました
    )

    リストを設定=
    for %i in (*) do set LIST=!LIST! %私
    %LIST% をエコー
于 2013-11-07T03:39:57.893 に答える