EitanTはおそらくあなたが探している解決策を持っていますが、それはあなたの問題を完全には説明していません。
IFステートメントを削除すると、実際のロジックをより適切に表示するようにインデントが調整された後、これが得られます。2番目のループは1番目のループ内で実行されます。
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET /A counter=0
SET /A counter2=0
for /f %%h in (users.txt) do (
set /a counter2=0
set /a counter=!counter!+1
for /f %%i in (users.txt) do (
set /a counter2=!counter2!+1
echo !counter! and !counter2!
)
)
IFステートメントを入力すると、この不適切なコードが表示されます
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET /A counter=0
SET /A counter2=0
for /f %%h in (users.txt) do (
set /a counter2=0
set /a counter=!counter!+1
for /f %%i in (users.txt) do (
set /a counter2=!counter2!+1
IF !counter! gtr !counter2!
echo !counter! and !counter2!
)
)
IFステートメントは不完全です-あなたはそれが本当なら何をすべきかを教えていませんでした。
ECHOをIFの一部にしたい場合は、次の3つのうちの1つを実行する必要があります。
1)ECHOをIFステートメントに追加します
IF !counter! gtr !counter2! echo !counter! and !counter2!
2)行継続を使用して、IF行とECHO行を1つの論理行に変換します
IF !counter! gtr !counter2!^
echo !counter! and !counter2!
3)別の括弧のセットを追加します。開き括弧はIFと同じ行にある必要があり、その前にスペースが必要であることに注意してください。
IF !counter! gtr !counter2! (
echo !counter! and !counter2!
)
ヘルプシステムは、IFの適切な構文を説明しています。ヘルプを取得するには、コマンドラインからHELP IF
またはを入力してください。IF /?
私が投稿したコードのロジックは、EitanTソリューションとは異なることに注意してください。どちらが正しいかわかりません。ほとんどのプログラミング言語と同様に、インデントはロジックに影響を与えません。インデントは、ロジックが何であるかを人間にわかりやすくするためにあります。元のインデントは、EitanTが提供したロジックを示しています。インデントを無視して、コンピューターが認識するロジックを提供しました。
ところで-SET/Aステートメントで変数を展開する必要はありません。以下は正常に機能します。
set /a counter=counter+1
さらに良いことに、インクリメント代入演算子を使用できます。
set /a counter+=1
SET / Aは、1つのステートメントで複数の割り当てもサポートします。
set /a counter2=0, counter+=1
最初のループ内でも初期化するため、上部のcounter2を初期化する必要はありません。
これは、インデントを無視して、既存の括弧に基づいて表示されるロジックを使用した最終的なコードです。
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET /A counter=0
for /f %%h in (users.txt) do (
set /a counter2=0, counter+=1
for /f %%i in (users.txt) do (
set /a counter2+=1
IF !counter! gtr !counter2! echo !counter! and !counter2!
)
)