我的.bat脚本中的If语句没有按预期工作

时间:2017-08-06 01:55:19

标签: batch-file if-statement

应该发生的是输入1到1,048,567之间的数字。程序会检查您的输入实际上是1到1,048,567之间的数字。如果您的输入是有效数字,那么它将继续到下一位代码。如果输入无效,那么它将显示一条消息,说明它无效,然后循环返回并再次询问您输入。 然而,当我运行它时,我输入任何内容并且它表示无效输入,即使我输入的数字介于1和1,048,567之间。

代码:

:setup
@echo off
title Pokemon Shiny Sim
set delay = nul
set count = 0
set chance = 4096

:settings
:setChance
cls
echo Set shiny chance (1 in x). Range: (1-1,048,567)
echo Leave blank for 1 in 4096.
set /p chance = Input: 
set /a chance = %chance%+0
if %chance% GEQ 1 (
    if %chance% LEQ 1048567 (
        goto setDelay
    )
)
echo Invalid Input.
pause
goto setChance
:setDelay
cls
echo Set delay between attempts in seconds. Range: (1-60).
echo Leave blank for no delay.
set /p delay = Input: 
set /a delay = %delay%+0
if %delay% == nul (
    goto loopStart
)
if %delay% GEQ 1 (
    if %delay% LEQ 60 (
        cls
        goto loopStart
    )
)
echo Invalid Input.
pause
goto settings

:loopStart
set /a count = %count%+1
set /a rand = %random% %% %chance%+1
if %rand% == 1 (
    echo Attempt: %count% | Shiny: Yes!
    pause
)
else (
    echo Attempt: %count% | Shiny: No
)
goto loopStart

2 个答案:

答案 0 :(得分:0)

我还没有测试过代码,但我在代码中发现了一些致命的问题。

错误设置变量

set /a count = %count% + 1

这设置变量count (注意空格!)。删除空间!此外,这可以缩短为set /a count+=1

ECHO特殊字符

|是批量重定向保留的特殊字符之一。要正确echo,请改用echo string ^| string

IF陈述练习

if %rand% == 1 (

仅在%rand%为字母数字时有效。如果%rand%为空格,则cmd.exe会看到:

if == 1 (

这是不正确的。

要纠正它,请执行

if "%rand%"=="1" (

或者,使用EQU进行数字比较,使用==进行字符串比较。

答案 1 :(得分:0)

我建议先阅读debugging a batch file,然后在第Why is no string output with 'echo %var%' after using 'set var = text' on command line?

页上找到答案

接下来查看下面的重写代码:

:setup
@echo off
title Pokemon Shiny Sim
set "delay=0"
set "count=0"
set "chance=4096"

:settings
:setChance
cls
echo Set shiny chance (1 in x). Range: (1-1,048,567)
echo Leave blank for 1 in 4096.
set /P "chance=Input: "
set /A chance+=0

if %chance% GEQ 1 if %chance% LEQ 1048567 goto setDelay

echo Invalid input.
pause
goto setChance

:setDelay
cls
echo Set delay between attempts in seconds. Range: (1-60).
echo Leave blank for no delay.
set /P "delay=Input: "
set /A delay+=0

if %delay% == 0 goto loopStart
if %delay% GEQ 1 if %delay% LEQ 60 cls & goto loopStart

echo Invalid input.
pause
goto settings

:loopStart
set /A count+=1
set /A rand=%random% %% chance + 1
if %rand% == 1 (
    echo Attempt: %count% ^| Shiny: Yes!
    pause
) else (
    echo Attempt: %count% ^| Shiny: No
)
goto loopStart

此批次代码中删除了等号周围的所有空格。

命令行set "delay = nul"被修改为set "delay=0",因为执行if %delay% == nul后条件set /a delay = %delay%+0永远不会导致执行set /a delay = nul + 0,导致将值0分配给delay上的环境变量nul,该环境变量nul不作为具有整数值的该名称的环境变量存在。有效算术表达式的结果始终是指定为环境变量的字符串的数字,而不是set /a chance = %chance%+0之类的字符串。

set /A chance+=0修改为set /a delay = %delay%+0set /A delay+=0修改为|,否则输入检查不安全,因为用户可以自由输入{{1}变量chance导致执行命令行set /a chance = |+0,导致批处理文件执行意外退出。

一般不要在算术表达式中使用%variable%!variable!

在命令提示符窗口中运行set /?的几个页面上的帮助输出在章节中解释了set /A的用法,即每个不能解释为数字或运算符的字符串会自动解释为名称在评估表达式时,应将当前值转换为整数的环境变量。如果根本没有定义环境变量或者它的值无法成功转换为32位有符号整数,则在表达式中将其替换为整数值0

有一些例外,例如在算术表达式中使用随机数,需要%random%!random!,或者变量名称包含空格字符或将被解释为运算符的字符。在这种情况下,Windows命令解释程序必须替换已处于预处理状态的环境变量名称,或者在执行命令set之前立即替换环境变量的随机值。

set /a chance = %chance%+0使得此批处理文件的用户也可能输入例如PROCESSOR_LEVELPROCESSOR_REVISION,此输入虽然根本不是数字,但会被视为有效,因为这些两个字符串是具有数字作为值的环境变量的名称。默认情况下,PROCESSOR_REVISION分配了一个十六进制数字,可以完全或部分地按照命令set进行处理。

另一种语法错误在块

if %rand% == 1 (
    echo Attempt: %count% | Shiny: Yes!
    pause
)
else (
    echo Attempt: %count% | Shiny: No
)

关键字else必须与 IF 条件的 true 分支的结束)位于同一行,{strong> IF 条件与{{1}分开带空格字符。

重定向运算符)必须使用插入符|进行转义,以解释为文字字符,以输出到控制台窗口。

注意: ^仍然可以输入例如set /A chance+=0170 percent,这会导致170X具有值chance因此输入有效,但实际上输入的字符串不是数字。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • 170
  • cls /?
  • echo /?
  • goto /?
  • if /?
  • pause /?
  • set /?