比较a / F循环内的变量(BATCH)

时间:2012-08-30 10:06:02

标签: if-statement for-loop batch-file

我有这段代码:

@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语句有错误。如果我把它划掉,一切都运行得很好。 我的语法有什么问题? 谢谢!

3 个答案:

答案 0 :(得分:2)

我可以发现两个问题:

1)第一个for循环没有右括号:

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

2)在第二个循环中,if语句没有左括号:

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

希望这有帮助!

答案 1 :(得分:2)

EitanT可能有您正在寻找的解决方案,但它并不能完全解释您的问题。

如果删除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
    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的一部分,那么您需要做三件事之一:

1)将ECHO附加到IF语句

IF !counter! gtr !counter2! echo !counter! and !counter2!


2)使用续行将IF和ECHO线转换为一条逻辑线

IF !counter! gtr !counter2!^
echo !counter! and !counter2!


3)添加另一组括号。请注意,左括号必须与IF在同一行,并且前面必须有一个空格。

IF !counter! gtr !counter2! (
  echo !counter! and !counter2!
)


帮助系统描述了IF的正确语法。从命令行键入HELP IFIF /?以获取帮助。

请注意,我发布的代码逻辑与EitanT解决方案不同。我不确定哪个是正确的。像大多数编程语言一样,缩进不会影响逻辑,它可以使人们更清楚逻辑是什么。您的原始缩进表示EitanT提供的逻辑。我忽略了缩进并提供了计算机看到的逻辑。

BTW - 您不需要在SET / A语句中扩展变量。以下工作正常:

set /a counter=counter+1

更好的是,您可以使用递增赋值运算符:

set /a counter+=1

SET / A还支持一个语句中的多个赋值:

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

答案 2 :(得分:1)

您的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! 
    )
  )
)

正确的缩进可以帮助您追踪包围错误。