0

私はこのコードを持っています:

@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 ステートメントにエラーがあります。私がそれを消すと、すべてうまくいきます。構文の何が問題になっていますか? ありがとう!

4

3 に答える 3

2

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!
  )
)
于 2012-08-30T12:46:40.063 に答える
2

2 つの問題を見つけることができます。

1) 最初のforループには閉じ括弧がありません:

for /f %%h in (users.txt) do (
    set /a counter2=0
    set /a counter=!counter!+1
)   <---------------------------------- You're missing this ")"!

2) 2 番目のループでは、ifステートメントに左括弧がありません。

IF !counter! gtr !counter2! (   <------ You're missing this "("!
        echo !counter! and !counter2! 
)

お役に立てれば!

于 2012-08-30T10:48:36.710 に答える
1

ステートメントifはすべて 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
    IF !counter! gtr !counter2! (
      echo !counter! and !counter2! 
    )
  )
)

正しいインデントは、ブラケット エラーを追跡するのに役立ちます。

于 2012-09-04T19:35:49.617 に答える