我写了一个代码来计算一些表达式。它的工作方式如下:calc 5+ 6 + 8*7
必须输出67。
我遇到的问题是按位运算符:calc 1 ^& 0
给出了错误。我的计算的想法很简单。首先将所有输入放在set a
然后set /A a=%a%
中以计算表达式
我的代码:
@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.
我认为当我们输入calc 1 ^& 0
时出现问题echo %g%
错误:0 is not recognized as an internal or external command
答案 0 :(得分:2)
问题在于&字符。您可以强制命令行接受&作为你正在做的有效字符,使用^前缀,但是一旦它在变量中,每次在批处理文件中使用此变量时,你都会得到一个真正的&符号。
在您的示例中,调用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 /a a=%a:"=%
当然,使用转义的&符号调用cmd
答案 1 :(得分:2)
问题在于&
或|
的输出为MC ND和提到的aphoria。
要解决它,最好使用延迟扩展,因为这并不关心这些字符。
这可以处理calc 1^&3
或计算“1& 3”
setlocal EnableDelayedExpansion
set "param=%~1"
echo !param!
但是当你试图将它传递给findstr时,你会遇到额外的问题,这需要额外的处理
答案 2 :(得分:1)
您的原始代码需要一些修复和代码简化,这是一个工作版本:
@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:正常尝试而不传递额外的(我的意思是双倍或三倍)^
个字符。
答案 3 :(得分:0)
使用三个^
来逃避它,如下所示:
calc 1 ^^^& 0
答案 4 :(得分:0)
DelayedExpansion
或goto
语句的示例。@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