在Windows命令行中拥有calc

时间:2013-10-17 17:33:42

标签: windows batch-file command-line cmd

我写了一个代码来计算一些表达式。它的工作方式如下: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

5 个答案:

答案 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)

以下是没有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