可以作为整数传递的批处理文件参数

问题描述 投票:0回答:1

我尝试编写一个批处理脚本,将输入与 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%
windows if-statement batch-file cmd variable-assignment
1个回答
0
投票

问题在于,当解析语句

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

开头的变量值的简单快速方法
© www.soinside.com 2019 - 2024. All rights reserved.