2

我写了一个代码来计算一些表达式。它的工作原理是这样的: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 ^& 0echo %g%0 is not recognized as an internal or external command

4

5 回答 5

2

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

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

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

但是当您尝试将其通过管道传输到 findstr 时,您遇到了额外的问题,这需要额外的处理

于 2013-10-17T18:27:41.907 回答
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

于 2013-10-17T17:47:39.557 回答
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:照常尝试,不要传递额外的(我的意思是双或三)^字符。

于 2013-10-17T18:33:06.517 回答
0

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

calc 1 ^^^& 0
于 2013-10-17T18:05:44.767 回答
0

这是一个没有DelayedExpansionorgoto语句的示例。

@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
于 2013-10-17T20:13:38.783 回答