我尝试编写一个批处理脚本,将输入与 2 个整数进行比较,如果它在它们的范围内,则将该值分配给一个变量。其他字符串参数也可以作为参数传递,因此我不知道哪个参数是我正在寻找的参数。
我正在尝试这样的事情:
SET MIN=20
SET MAX=79
if not "%~1"=="" (
if %2 leq %MAX% if %2 geq %MIN% set VAR=%2
)
if not "%~2"=="" (
if %2 leq %MAX% if %2 geq %MIN% set VAR=%2
)
if not "%~3"=="" (
if %3 leq %MAX% if %3 geq %MIN% set VAR=%3
)
问题是当我只向脚本传递 2 个参数时,第三个条件将崩溃并显示一条消息:
此时79出乎意料。
看起来条件内的表达式是由脚本计算的,我不确定如何解决这个问题。
这样的东西有效,但我不喜欢它,因为它看起来很糟糕:
if not "%~2"=="" (set TMP_VAR=%2) else (set TMP_VAR=99999)
if %TMP_VAR% leq %MAX% if %TMP_VAR% geq %MIN% set VAR=%TMP_VAR%
问题在于,当解析语句
if…(…)
或 if…(…) else (…)
时,整个语句必须在语法上正确才能执行,并使用所涉及的任何变量的当前值。
因此,如果缺少
%3
,则在解析时语句将变为:
如果不是“”==“”(如果 leq 79 如果 geq 20 设置 VAR=)
因此解析器看到
if leq 79
,认为 79
不是比较运算符,因此该语句在语法上不正确,因此报告并停止。
请注意,仅考虑语法,因此
not ""==""
会导致语句不被执行这一事实并不相关。
那么 - 如何解决?
怎么样
@ECHO OFF
SETLOCAL
SET /a max=79
SET /a min=20
set /a var1=%~1 2>nul
set /a var2=%~2 2>nul
set /a var3=%~3 2>nul
set "error="
CALL :VERIFY var1 "%var1%" "%~1"
CALL :VERIFY var2 "%var2%" "%~2"
CALL :VERIFY var3 "%var3%" "%~3"
SET err
SET var
GOTO :eof
:VERIFY
if NOT defined %1 set "error=%error% %1 not defined"&GOTO :eof
:: %1 is a defined variable
if %2 neq %3 set "error=%error% %1 not numeric"&GOTO :eof
IF %~2 gtr %MAX% set "error=%error% %1 too big"&GOTO :eof
IF %~2 lss %MIN% set "error=%error% %1 too small"&GOTO :eof
GOTO :eof
set /a
在算术模式下设置变量。 2>nul
会抑制“缺少操作数”等错误消息。
建立一个名为
error
的空变量。
执行
verify
子例程,传递正在验证的变量的名称、引用值和引用源值。
子例程检查变量是否已定义,如果没有定义,则生成错误。
然后将分配给变量 (%2) 的值与指定为程序参数 (%3) 的值进行匹配。如果这些不同,则为程序提供了非数字参数(如
junk
)或有效的非十进制字符串(如 0xa3
,其计算结果为 163
- 以及字符串 0xa3
& 163
不同)
然后挑战极限。
如果所有测试都通过,则
if defined error
将为 FALSE。
set err
/set var
是显示以 err
/var
开头的变量值的简单快速方法