@echo off echo 欢迎使用2K/XP表达式计算批处理 echo Made by Brglng 2005.8.15 echo 下载地址:brglng.ys168.com echo 有bug请及时汇报!Email:sky-0310@sohu.com echo. echo 注意:本批处理只能用于NT类的系统,不能用于Win9x/Me/DOS! echo 如果在命令行下使用,请用附件里的“命令提示符”或者使用 echo cmd.exe,而不要使用command.com! echo This batch file can only be used in Chinese version of echo Windows 2K/XP/2003...! echo Do not use command.com instead of cmd.exe! pause :inputExpr set Expr= set EvalExpr= echo. echo 请输入表达式(输入"?"查看帮助): set /p Expr= if "%Expr%"=="" ( goto inputExpr ) if "%Expr%"=="?" ( echo 本表达式计算批处理很简单并以递减的优先权顺序支持下列操作: echo ^(^) ^- 分组 echo ^! ^~ ^- ^- 一元运算符 echo ^* ^/ ^% ^- 算数运算符 echo ^+ ^- ^- 算数运算符 echo ^<^< ^>^> ^- 逻辑移位 echo ^- 按位“与” echo ^^ ^- 按位“异” echo ^| ^- 按位“或” echo ^= ^*^= ^/^= ^%^= ^+^= ^-^= ^- 赋值 echo ^&^= ^^^= ^|^= ^<^<^= ^>^>^= echo ^, ^- 表达式分隔符 echo 如果您使用任何逻辑或取余操作符, 您需要将表达式字符串用 echo 引号扩起来。在表达式中的任何非数字字符串键作为环境变量 echo 名称,这些环境变量名称的值已在使用前转换成数字。如果指定 echo 了一个环境变量名称,但未在当前环境中定义,那么值将被定为 echo 零。这使您可以使用环境变量值做计算而不用键入那些 % 符号 echo 来得到它们的值。除十六进制有 0x 前缀,八进制有 0 前缀的, echo 数字值为十进位数字。因此, 0x12 与 18 和 022 相同。请注意 echo 八进制公式可能很容易搞混: 08 和 09 是无效的数字,因为 8 echo 和 9 不是有效的八进制位数。 goto inputExpr ) set /a EvalExpr="%Expr%" if "%EvalExpr%"=="" ( echo 输入错误! goto inputExpr ) echo 计算结果为:%EvalExpr% :if_save set SaveEval= echo. echo 是否将表达式和计算结果存入文件[Y/N]? set /p SaveEval= if "%SaveEval%"=="Y" goto save if "%SaveEval%"=="y" goto save if "%SaveEval%"=="N" goto next if "%SaveEval%"=="n" goto next goto if_save :save echo 请输入文件路径及文件名(如C:\Windows\file.txt。若不输入路径则表示当前文件夹,留空则为上一次输入的路径): set /p SaveEvalPath= echo %Expr%=%EvalExpr% >>%SaveEvalPath% echo 表达式以及计算结果已存入%SaveEvalPath%! :next set EvalNext= echo 1.继续计算 2.退出 set /p EvalNext= if "%EvalNext%"=="1" goto inputExpr if "%EvalNext%"=="2" goto end goto next :end echo 谢谢使用!按任意键退出…… pause >nul set Expr= set EvalExpr= set SaveEval= set SaveEvalPath= set EvalNext=这个批处理的最新版可以在我的E盘的“DIY”目录里下载到。 [ Last edited by namejm on 2007-2-3 at 09:49 PM ]
Originally posted by Michael at 2005-8-15 07:44 PM: 也许只有2k/xp才有现成的表达式求值语句吧。嗯,没错 其实,要真正实现更好的表达式计算,只要用那些命令行计算器就可以了。它们的使用都很方便。NT的set命令的/a参数也有很多限制的,功能并不强,比如不支持浮点数,不支持复杂的数学函数(如sin、cos)等。所以,这个批处理实际上没什么实用价值,只能作为学习学习吧。我自认为这个批处理对2K/XP新的命令开关和语法的综合运用还是不错的。 [ Last edited by brglng on 2005-8-16 at 10:18 ]
Originally posted by willsort at 2005-8-19 08:31 PM: Re brglng: 很好的代码,提三个建议: 1、加入命令行参数支持,即在允许在命令行参数中写入表达式或者/?; 2、set /p 的提示字笠...谢谢Willsort高手的建议。关于收录,我没什么意见,反正本来就是随便写写的。
@echo off
echo 本表达式计算批处理很简单并以递减的优先权顺序支持下列操作: >EvalExpr.hlp
echo. >>EvalExpr.hlp
echo ^(^) ^- 分组 >>EvalExpr.hlp
echo ^! ^~ ^- ^- 一元运算符 >>EvalExpr.hlp
echo ^* ^/ %% ^- 算数运算符 >>EvalExpr.hlp
echo ^+ ^- ^- 算数运算符 >>EvalExpr.hlp
echo ^<^< ^>^> ^- 逻辑移位 >>EvalExpr.hlp
echo ^- 按位“与” >>EvalExpr.hlp
echo ^^ ^- 按位“异” >>EvalExpr.hlp
echo ^| ^- 按位“或” >>EvalExpr.hlp
echo ^= ^*^= ^/^= %%^= ^+^= ^-^= ^- 赋值 >>EvalExpr.hlp
echo ^&^= ^^^= ^|^= ^<^<^= ^>^>^= >>EvalExpr.hlp
echo ^, ^- 表达式分隔符 >>EvalExpr.hlp
echo. >>EvalExpr.hlp
echo 如果您使用任何逻辑或取余操作符, 您需要将表达式字符串用引号扩起来。在表达式中的任何非数字字符串键作为环境变量名称,这些环境变量名称的值已在使用前转换成数字。如果指定了一个环境变量名称,但未在当前环境中定义,那么值将被定为零。这使您可以使用环境变量值做计算而不用键入那些 %% 符号来得到它们的值。除十六进制有 0x 前缀,八进制有 0 前缀的,数字值为十进位数字。因此, 0x12 与 18 和 022 相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,因为 8 和 9 不是有效的八进制位数。 >>EvalExpr.hlp
::cls
if "%1"=="" goto start
if "%1"=="/?" goto start
if /i "%1"=="/?:Expr" goto start
if /i "%1"=="/A" if "%2"=="" (
echo 必须指定文件路径!
goto end
)
if /i "%1"=="/A" goto start
set /a EvalExpr=%1
if "%EvalExpr%"=="" (
echo 表达式输入错误!
goto end
)
echo %1=%EvalExpr%
if "%2"=="" goto end
echo %1=%EvalExpr% >>"%2"
echo 算式和计算结果已存入"%2"!
goto end
:start
if /i "%1"=="/?:Expr" more EvalExpr.hlp
if /i "%1"=="/?:Expr" goto end
echo 欢迎使用2K/XP表达式计算批处理
echo Made by Brglng 2005.8.25
echo 下载地址:http://brglng.ys168.com
echo 有bug请及时汇报!Email:sky-0310@sohu.com
echo.
echo 注意:本批处理只能用于NT类的系统,不能用于Win9x/Me/DOS!
echo 如果在命令行下使用,请用附件里的“命令提示符”或者使用cmd.exe,而不要使用command.com!
echo This batch file can only be used in Chinese version of Windows 2K/XP/2003...!
echo Do not use command.com instead of cmd.exe!
echo.
if not "%1"=="/?" pause
if not "%1"=="/?" goto inputExpr
echo 用法:
echo EvalExpr [表达式] [文件路径]
echo EvalExpr [/A] [文件路径]
echo EvalExpr [/?]
echo EvalExpr [/?:Expr]
echo.
echo [表达式] : 要计算的表达式
echo [文件路径] : 使用此参数将表达式和计算结果存入指定的文件
echo [/A] [文件路径] : 非使用参数计算时总是将计算结果自动存入指定文件
echo 注:文件路径将作为第二个参数,必须和/A参数配合使用。
echo [/?] : 查看此帮助
echo [/?:Expr] : 查看表达式书写方面的帮助
goto end
:inputExpr
echo.
set Expr=
set EvalExpr=
set /p Expr=请输入表达式(输入"?"查看帮助, "Exit"退出):
if "%Expr%"=="" goto inputExpr
if "%Expr%"=="?" (
echo.
more EvalExpr.hlp
goto inputExpr
)
if /i "%Expr%"=="Exit" goto end
set /a EvalExpr="%Expr%"
if "%EvalExpr%"=="" (
echo 输入错误!
goto inputExpr
)
echo 计算结果为:%EvalExpr%
if /i "%1"=="/A" goto autosave
:if_save
set SaveEval=
echo.
set /p SaveEval=是否将表达式和计算结果存入文件[Y/N]?
if /i "%SaveEval%"=="Y" goto save
if /i "%SaveEval%"=="N" goto inputExpr
goto if_save
:save
set /p SaveEvalPath=请输入文件路径及文件名(如C:\Windows\file.txt。若不输入路径则表示当前文件夹,留空则为上一次输入的路径):
echo "%Expr%"=%EvalExpr% >>"%SaveEvalPath%"
echo 表达式以及计算结果已存入"%SaveEvalPath%"!
goto inputExpr
:autosave
echo "%Expr%"=%EvalExpr% >>"%2"
goto inputExpr
:end
if /i "%1"=="/A" if not "%2"=="" echo 所有的表达式和计算结果都已存入"%2"!
del /q EvalExpr.hlp >nul 2>nul
set Expr=
set EvalExpr=
set SaveEval=
set SaveEvalPath=
set EvalNext=
10 if flag=-1 goto 80
15 input "A=",expres$
20 if expres$="" goto 90
20 open "temp.bas" for output as #1
30 print #1,"10 A=";expres$
40 print #1,"20 PRINT ";CHR$(34);expres$;"=";chr$(34);"A"
50 print #1,"30 flag=-1"
60 print #1,"40 chain ";CHR$(34);"main.bas";CHR$(34)
70 close #1
75 chain "temp.bas"
80 goto 10
90 end
if flag=-1 goto 70
10 input "A=",expres$
if expres$="" goto 80
open "temp.bas" for output as #1
print #1,"ON ERROR RESUME NEXT
print #1,"10 A=";expres$
PRINT #1,"IF ERR>0 THEN PRINT";CHR$(34);"Error!";CHR$(34);":goto 30"
print #1,"20 PRINT ";CHR$(34);expres$;"=";chr$(34);"A"
print #1,"30 flag=-1"
print #1,"40 chain ";CHR$(34);"main.bas";CHR$(34)
close #1
chain "temp.bas"
80 goto 10
90 end
:: Eval.bat - 2K/XP表达式计算批处理
:: Brglng - 2005.8.25
:: Modified: Will Sort - 2005.8.26
@echo off
setlocal
if /i "%1"=="/A" if "%2"=="" echo 必须指定文件路径!& goto end
if /i not "%1"=="/A" if not "%1"=="/?" if not "%1"=="" goto EvalArgument
:EvalLogo
cls
echo.
echo 欢迎使用2K/XP表达式计算批处理
echo Made by Brglng 2005.8.25
echo 下载地址:http://brglng.ys168.com
echo 有bug请及时汇报!Email:sky-0310@sohu.com
echo.
echo 注意:本批处理只能用于NT类的系统,不能用于Win9x/Me/DOS!
echo 如果在命令行下使用,请用附件里的“命令提示符”或者使用cmd.exe,而不要使用command.com!
echo This batch file can only be used in Chinese version of Windows 2K/XP/2003...!
echo Do not use command.com instead of cmd.exe!
echo.
if not "%1"=="/?" goto inputExpr
:Help
pause>nul
cls
echo 命令行书写帮助:
echo.
echo %0 [表达式] [文件路径]
echo %0 [/A 文件路径]
echo %0 [/?]
echo %0 [/? Expr]
echo.
echo [表达式] : 要计算的表达式
echo [文件路径] : 使用此参数将表达式和计算结果存入指定的文件
echo [/A 文件路径] : 非使用参数计算时总是将计算结果自动存入指定文件
echo 注:文件路径将作为第二个参数,必须和/A参数配合使用。
echo [/?] : 查看命令行书写帮助
echo [/? Expr] : 查看命令行书写帮助与表达式书写帮助
echo.
if /i not "%2"=="Expr" goto end
pause>nul
:ExprHelp
cls
echo 表达式书写帮助:
echo.
::set /?> sethelp.txt
::for /f "skip=29 delims=" %%h in (sethelp.txt) do echo %%h & if "%%h"=="因为 8 和 9 不是有效的八进制位数。" goto end
echo 本表达式计算批处理很简单并以递减的优先权顺序支持下列操作:
echo.
echo ^(^) ^- 分组
echo ^! ^~ ^- ^- 一元运算符
echo ^* ^/ %% ^- 算数运算符
echo ^+ ^- ^- 算数运算符
echo ^<^< ^>^> ^- 逻辑移位
echo ^- 按位“与”
echo ^^ ^- 按位“异”
echo ^| ^- 按位“或”
echo ^= ^*^= ^/^= %%^= ^+^= ^-^= ^- 赋值
echo ^&^= ^^^= ^|^= ^<^<^= ^>^>^=
echo ^, ^- 表达式分隔符
echo.
echo 如果您使用任何逻辑或取余操作符, 您需要将表达式字符串用引号扩起来。在表达式中的任何非数字字符串键作为环境变量名称,这些环境变量名称的值已在使用前转换成数字。如果指定了一个环境变量名称,但未在当前环境中定义,那么值将被定为零。这使您可以使用环境变量值做计算而不用键入那些 %% 符号来得到它们的值。除十六进制有 0x 前缀,八进制有 0 前缀的,数字值为十进位数字。因此, 0x12 与 18 和 022 相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,因为 8 和 9 不是有效的八进制位数。
goto end
:EvalArgument
set /a EvalExpr=%1
if "%EvalExpr%"=="" echo 表达式输入错误!& pause & goto ExprHelp
echo %1=%EvalExpr%
if "%2"=="" goto end
echo %1=%EvalExpr% >>"%2"
echo 算式和计算结果已存入"%2"!
goto end
:inputExpr
set Expr=
set EvalExpr=
set /p Expr=请输入表达式(输入"?"查看帮助, "Q"退出):
if "%Expr%"=="" goto inputExpr
if "%Expr%"=="?" call:ExprHelp & goto inputExpr
if /i "%Expr%"=="Q" goto end
set /a EvalExpr="%Expr%"
if "%EvalExpr%"=="" echo 输入错误!& goto inputExpr
echo 计算结果为:%EvalExpr%
if /i "%1"=="/A" goto autosave
:if_save
set SaveEval=
echo.
set /p SaveEval=是否将表达式和计算结果存入文件[Y/N]?
if /i "%SaveEval%"=="Y" goto save
if /i "%SaveEval%"=="N" goto inputExpr
goto if_save
:save
set /p SaveEvalPath=请输入文件路径及文件名(如C:\Windows\file.txt。若不输入路径则表示当前文件夹,留空则为上一次输入的路径):
echo "%Expr%"=%EvalExpr% >>"%SaveEvalPath%"
echo 表达式以及计算结果已存入"%SaveEvalPath%"!
goto inputExpr
:autosave
echo "%Expr%"=%EvalExpr% >>"%2"
goto inputExpr
:end
:: Eval.cmd - 2K/XP表达式计算批处理
:: Brglng - 2005.8.31
:: Thanks to: Will Sort modified on 2005.8.26
:: This batch file can only run in Chinese version of NT-based Windows! It cannot be run in DOS/Win9x/Me!
:: And do not use COMMAND.COM instead of CMD.EXE! Command.com cannot display Chinese, and its SET command is not as powerful as that of CMD.EXE
@echo off
setlocal
if /i "%1"=="/A" if "%2"=="" echo 必须指定文件路径!& goto end
if /i not "%1"=="/A" if /i not "%1"=="/N" if not "%1"=="/?" if not "%1"=="" goto EvalArgument
:EvalLogo
echo *****************************************************************
echo * Eval.cmd - 2K/XP表达式计算批处理 *
echo * Brglng 2005.8.31 http://brglng.ys168.com *
echo * Thanks to: Will Sort modified on 2005.8.26 *
echo *****************************************************************
echo.
if not "%1"=="/?" echo 请输入表达式(输入"?"查看帮助, "Q"退出) & goto inputExpr
:Help
echo 命令行书写帮助:
echo.
echo %0 [表达式] [文件路径]
echo 表达式 : 指定要计算的表达式
echo 文件路径 : 若指定此参数则自动将表达式和计算结果存入指定文件。
echo.
echo %0 [/A 文件路径] : 普通模式下运行时总是将计算结果自动存入指定文件。
echo %0 [/N] : 普通模式下运行时只计算而不存入文件。
echo %0 [/?] : 查看命令行书写帮助
echo %0 [/? Expr] : 查看命令行书写帮助与表达式书写帮助
echo.
echo 如果不使用参数则进入默认的计算模式, 每次都须输入表达式并
echo 询问是否存入文件。
if /i not "%2"=="Expr" goto end
echo.
pause
:ExprHelp
echo 表达式书写帮助:
echo.
echo 本表达式计算批处理能处理简单计算,不支持浮点数以及高级数学函数。
echo 它以递减的优先权顺序支持下列操作:
echo.
echo () - 分组
echo ! ~ - - 一元运算符
echo * / %% - 算数运算符
echo + - - 算数运算符
echo ^<^< ^>^> - 逻辑移位
echo - 按位“与”
echo ^^ - 按位“异”
echo ^| - 按位“或”
echo = *= /= %%= += -= - 赋值
echo ^&= ^^= ^|= ^<^<= ^>^>=
echo , - 表达式分隔符
echo.
echo 如果在命令行下用参数计算,使用任何逻辑或取余操作符需要将表达式字符串用引号扩起来。表达式中的任何非数字字符串键作为环境变量名称,这些环境变量名称的值应在使用前定义,如果未在当前环境中定义,则默认为为零。您可以直接使用环境变量值做计算而不用键入那些 %% 符号来得到它们的值。除十六进制有 0x 前缀,八进制有 0 前缀的,数字值为十进位数字。因此, 0x12 与 18 和 022 相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,因为 8 和 9 不是有效的八进制位数。
goto end
:EvalArgument
set /a EvalExpr="%1"
if "%EvalExpr%"=="" echo 表达式输入错误! & goto end
echo %1=%EvalExpr%
if "%2"=="" goto end
echo %1=%EvalExpr% >>"%2"
echo 算式和计算结果已存入"%2"!
goto end
:inputExpr
set Expr=
set EvalExpr=
set /p Expr=^>
if "%Expr%"=="" goto inputExpr
if "%Expr%"=="?" call:ExprHelp & goto inputExpr
if /i "%Expr%"=="Q" goto end
set /a EvalExpr="%Expr%"
if "%EvalExpr%"=="" echo 输入错误! & goto inputExpr
echo 计算结果为:%EvalExpr%
if /i "%1"=="/A" goto autosave
if /i "%1"=="/N" goto inputExpr
:if_save
set SaveEval=
set /p SaveEval=是否将表达式和计算结果存入文件[Y/N]?
if /i "%SaveEval%"=="Y" goto save
if /i "%SaveEval%"=="N" goto inputExpr
goto if_save
:save
set /p SaveEvalPath=请输入文件路径及文件名(如C:\Windows\file.txt。若只输入文件名则自动存入当前文件夹,留空则为上一次输入的路径):
echo "%Expr%"=%EvalExpr% >>"%SaveEvalPath%"
echo 表达式以及计算结果已存入"%SaveEvalPath%"!
goto inputExpr
:autosave
echo "%Expr%"=%EvalExpr% >>"%2"
goto inputExpr
:end
WScript.Echo Eval(WScript.Arguments(0))
cscript //NoLogo Eval.vbs 3.1415926*2E5 返回 628318.52成功,yeah! 或者不用输入参数,交互式输入的:
WScript.Echo Eval(WScript.StdIn.ReadLine)