我一直在尝试制作一个程序来检测输入的字符串是否包含 +、-、* 或/然后对其进行计算。问题是无论字符串是否包含字符,var 总是被定义。
例子:
输入:不是数学命令
输出:var 已定义(数学输入
我想要的:变量未定义
输入:10+10
输出:var 已定义(数学输入
我想要的:var 被定义(数学输入
输入: ABC123
输出:var 已定义(数学输入
我想要的:变量未定义
我从这个链接改编了我的代码:
如何检查 Windows 批处理文件中的参数(或变量(是否为数字
法典:
@echo off
SET "var="
set /p "COMMAND=Enter command>"
for /f "delims=^+-^*/" %%i in ("%COMMAND%") do set "var=%%i"
if not defined var (
echo var not defined
) else (
echo var is defined (math input)
)
pause
Ah - 您使用的代码旨在检测所讨论的字符串是否仅包含数字。
您的要求似乎是检测字符串是否至少包含一个分隔符。
for/f "tokens=1*delims=^+-^*/" %%i in ("%COMMAND%"( do set "svar=%%i"&set "var=%%j">
将svar
设置为分隔符之前的部分,var
设置为分隔符之后的部分,但它将忽略任何前导分隔符字符,并且不会反对连续的分隔符,例如abc++//++def
,因为分区为tokens
将主题字符串作为序列delimstoken1delimstoken2...
为了确保只有数字和算术运算符,%command%
有几种方法,
我会使用findstr.exe
有限的正则表达式功能。
由于%command%
中的空格会干扰结果,因此我删除了它们
(减号必须用反斜杠转义,因为它表示 [类] 中的一个范围(:
:: Q:Test2017 721SO_45225802.cmd
@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
Cls
:loop
SET "var="
set /p "ArithmeticExpression=Enter arithmetic expression> "
:: Check if input consists of only numbers and operators
Echo:%ArithmeticExpression: =%|Findstr "^[0-9+-*/][0-9+-*/]*$" >NUL 2>&1
If Errorlevel 1 (
Echo Invalid characters in %ArithmeticExpression%
) Else (
Set /a "var=%ArithmeticExpression%"
If defined var (
Echo %ArithmeticExpression% evaluates to !var!
) Else (
Echo Error evaluating %ArithmeticExpression%
)
)
Goto :loop
示例运行:
Enter arithmetic expression> 1 + 1
1 + 1 evaluates to 2
Enter arithmetic expression> 10 * 3
10 * 3 evaluates to 30
Enter arithmetic expression> 30 -3
30 -3 evaluates to 27
Enter arithmetic expression> 27 / 3
27 / 3 evaluates to 9
Enter arithmetic expression> ABC123
Invalid characters in ABC123
Enter arithmetic expression> 10/0
Divide by zero error.
Error evaluating 10/0
Enter arithmetic expression>