在Windows命令行中拥有自己的calc

我写了一个代码来计算一些expression式。 它是这样工作的: calc 5+ 6 + 8*7必须输出67.我面临的问题是按位运算符: calc 1 ^& 0给出错误。 我的计算的想法很简单。 首先把所有的input放在一起,然后set /A a=%a%来计算expression式我的代码:

 @echo off if "%1" == "" goto :help if "%1" == "/?" goto :help set "g=" :start rem ***Stick all our input together*** set "g=%g%%1" if not "%1" == "" ( if "%1" == "/?" ( goto :help ) shift goto :start ) echo %g%| findstr /R "[^0123456789\+\-\*\/\(\)] \+\+ \-\- \*\* \/\/ \= \=\= \^^" >nul 2>&1 if not ERRORLEVEL 1 goto error set /A "g=%g%" 2>nul if ERRORLEVEL 1 goto error echo %g% set g= goto :EOF :help echo This is simple calculator echo Usage: Mycalc.cmd [/?] (EXPRESSION) echo Available operands:+,-,*,/,(,) goto :EOF :error echo Wrong input or calculation error. 

我认为当我们inputcalc 1 ^& 0出现错误, echo %g%0 is not recognized as an internal or external command

问题是&字符。 您可以强制命令行使用^前缀来接受&作为有效字符,但是一旦它在变量中,每次在批处理文件中使用此变量时,都会得到一个真正的&符号。

在你的例子中,执行时调用calc 1 ^&0

 echo %g% 

cmd文件正在运行的是

 echo 1 & 0 

回显字符1并运行程序0

怎么解决?

 rem read all command line and put inside quotes set a="%*" rem replace ampersand with escaped ampersand set a=%a:&=^&% rem execute calculation without quotes set /aa=%a:"=% 

而且,当然,请致电cmd与逃脱的&符号

问题是&|的输出 如MC ND和提到的无忧无虑。
要解决它最好使用延迟扩展,因为这不关心这些字符。

这可以处理calc 1^&3或者也可以计算“1&3”

 setlocal EnableDelayedExpansion set "param=%~1" echo !param! 

但是当你尝试把这个发送到findstr时,你会遇到额外的问题,这需要额外的处理

您的原始代码需要一些修复和代码简化,这里是一个工作版本:

 @echo off if "%~1" EQU "" (goto :help) if "%~1" EQU "/?" (goto :help) :start rem ***Stick all our input together*** Set "g=%*" set /A "g=%g: =%" REM echo Input: "%g%" set /A "g=%g%" 2>nul || (goto error) echo %g% set "g=" goto :EOF :help echo This is simple calculator echo Usage: Mycalc.cmd [/?] (EXPRESSION) echo Available operands:+,-,*,/,(,) goto :EOF :error echo Wrong input or calculation error. 

PS:像平常一样尝试,而不需要传递额外的(我的意思是双倍或三倍) ^字符。

用三个^来逃避它,就像这样:

 calc 1 ^^^& 0 

这是一个没有DelayedExpansiongoto语句的例子。

 @echo off setlocal DisableDelayedExpansion set "Input=%*" rem No Input, display help if not defined Input ( call :Help ) else call :Main || call :Error endlocal & exit /b %ErrorLevel% :Main rem Clean Input of poison double quotations set "Input=%Input:"=%" rem Check for the /? help parameter if "/?"=="%Input:~0,2%" call :Help & exit /b 0 rem Validate the characters in the Input for /f "delims=0123456789+-*/()&| " %%A in ("%Input%") do exit /b 1 rem Perform the calculations set /a "Input=%Input: =%" 2>nul rem Validate the Result for /f "delims=0123456789" %%A in ("%Input%") do exit /b 1 rem Display the Result echo(%Input% exit /b %ErrorLevel% :Help echo This is simple calculator echo Usage: Mycalc.cmd [/?] (EXPRESSION) echo Available operands:+,-,*,/,^(,^),^&,^| exit /b 0 :Error echo Wrong input or calculation error. exit /b 0