Batch file my.bat脚本中的If语句不是';他没有按预期工作

Batch file my.bat脚本中的If语句不是';他没有按预期工作,batch-file,if-statement,Batch File,If Statement,假设您输入一个介于1和1048567之间的数字。该程序检查您的输入是否实际上是一个介于1和1048567之间的数字。如果您的输入是一个有效的数字,那么它将继续到下一位代码。如果输入无效,则会显示一条消息,说明输入无效,然后返回并再次要求您输入。 然而,当我运行这个程序时,我输入了任何东西,它显示输入无效,即使我输入了一个介于1和1048567之间的数字 代码: 我还没有测试代码,但是我在代码中发现了一些致命的问题 错误设置变量 这将设置一个变量count(注意空格!)。删除空间!此外,这可以缩

假设您输入一个介于1和1048567之间的数字。该程序检查您的输入是否实际上是一个介于1和1048567之间的数字。如果您的输入是一个有效的数字,那么它将继续到下一位代码。如果输入无效,则会显示一条消息,说明输入无效,然后返回并再次要求您输入。 然而,当我运行这个程序时,我输入了任何东西,它显示输入无效,即使我输入了一个介于1和1048567之间的数字

代码:


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


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


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


较差的
IF
语句实践 仅当
%rand%
为字母数字时有效。如果
%rand%
是空格,则cmd.exe会看到:

if == 1 (
这是不正确的

要纠正它,请执行以下操作

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

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

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


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


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


较差的
IF
语句实践 仅当
%rand%
为字母数字时有效。如果
%rand%
是空格,则cmd.exe会看到:

if == 1 (
这是不正确的

要纠正它,请执行以下操作

if "%rand%"=="1" (
或者,使用
eq
进行数字比较,使用
==
进行字符串比较。

我建议先阅读

下一步看一下您的重写代码:

: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”
因为执行
set/a delay=%delay%+0
后,如果%delay%==nul的条件
永远不为真,导致执行
set/a delay=nul+0
,这会导致将值
0
分配给
nul
上的环境变量
delay
不存在为环境变量具有整数值的名称。有效算术表达式的结果始终是作为字符串分配给环境变量的数字,而不是像
nul
这样的字符串

set/a chance=%chance%+0
被修改为
set/a chance+=0
set/a delay=%delay%+0
被修改为
set/a delay+=0
,因为否则输入检查是不安全的,因为用户可以自由输入变量
chance
,从而执行命令行
set/a chance=|+0
,这会导致批处理文件执行意外退出

切勿使用
%variable%
!变数在算术表达式中,通常不需要

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

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

set/a chance=%chance%+0
还允许此批处理文件的用户输入例如
PROCESSOR\u LEVEL
PROCESSOR\u REVISION
,并且此输入虽然根本不是一个数字,但将被视为有效,因为这两个字符串是以数字表示的环境变量的名称价值观
PROCESSOR\u REVISION
默认分配了一个十六进制数,但可以通过命令
set
将其全部或部分作为数字处理

另一个语法错误在块中

if %rand% == 1 (
    echo Attempt: %count% | Shiny: Yes!
    pause
)
else (
    echo Attempt: %count% | Shiny: No
)
关键字
else
必须与true分支的结束
位于同一行,如果条件与
用空格分隔

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

注意:
设置/A chance+=0
仍然可以输入例如
170%或
170X
,这会导致
chance
具有值
170
,因此输入是有效的,尽管实际输入的字符串不是数字

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,然后阅读全文
if %rand% == 1 (
    echo Attempt: %count% | Shiny: Yes!
    pause
)
else (
    echo Attempt: %count% | Shiny: No
)