标题: 一个可以计算简单表达式的批处理 
[打印本页]
作者: brglng     
时间: 2005-8-15 15:53    
标题: 一个可以计算简单表达式的批处理
我编了一个有趣的批处理,用于2K/XP等NT类的系统,可以计算简单的表达式。只能算作入门级的吧,所以就贴在这里了。
@echo off
echo 欢迎使用2K/XP表达式计算批处理
echo Made by Brglng 2005.8.15
echo 下载地址:http://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 是否将表达式和计算结果存入文件?
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 ]
 
作者: venchia     
时间: 2005-8-15 18:02
不错,收藏
作者: merlin     
时间: 2005-8-15 19:00
怎么不写一个Win9x/me/DOS的啊!
作者: Michael     
时间: 2005-8-15 19:44
也许只有2k/xp才有现成的表达式求值语句吧。
作者: brglng     
时间: 2005-8-16 09:41
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 ]
 
作者: Michael     
时间: 2005-8-16 21:36
开始还真吓了我一跳,我还以为表达式计算也是批处理完成的呢。
C++编一个类似程序还得需要这么多行呢:
#include<iostream>
#include<string>
#include<map>
#include<cctype>
#include<sstream>
using namespace std;
namespace Parser
{
	double prim(bool);
	double term(bool);
	double expr(bool);
}
namespace Lexer
{
	enum Token_value
	{
	NAME, NUMBER, END,
	PLUS='+', MINUS='-', MUL='*', DIV='/',
	PRINT=';', ASSIGN='=', LP='(', RP=')'
	};
	
	Token_value curr_tok;
	double number_value;
	string string_value;
	map<string,double>table;
	Token_value get_token();
	}
namespace Driver
{
	int no_of_errors;
	istream* input;
	void skip();
	void sta();
}
namespace Error
{
	struct Syntax_error
	{
		const char* p;
		Syntax_error(const char* q) {p=q;}
	};
	struct Zero_divide{};
}
using namespace Driver;
using namespace Parser;
using namespace Lexer;
using namespace Error;	
double Parser::expr(bool get)
{
	double left=term(get);
	for(;;)
		switch(curr_tok)
		{
		case PLUS:
			left+=term(true);
			break;
		case MINUS:
			left-=term(true);
			break;
		default:
			return left;
		}
}
double Parser::term(bool get)
{
	double left=prim(get);
	for(;;)
		switch(curr_tok)
		{
		case MUL:
			left*=prim(true);
			break;
		case DIV:
			if(double d=prim(true))
			{
				left/=d;
				break;
			}
			throw Zero_divide();
		default:
			return left;
		}
}
double Parser::prim(bool get)
{
	if (get) get_token();
	switch(curr_tok)
	{
	case NUMBER:
		{	
			double v=number_value;
			get_token();
			return v;
		}
	case NAME:
		{
			double& v=table;
			if(get_token()==ASSIGN)v=expr(true);
			return v;
		}
	case MINUS:
		return -prim(true);
	case LP:
	{
		double e=expr(true);
		if(curr_tok!=RP) throw Syntax_error("')'expected");
		get_token();
		return e;
	}
		
	default:
		throw Syntax_error("primary expected");
	}
	
}
Token_value Lexer::get_token()
{
	char ch;
	do
	{
		if(!input->get(ch))return curr_tok=END;
	}while(ch!='\n'&&isspace(ch));
		switch(ch)
		{		
		case '\n':
			return curr_tok=PRINT;
		case ';':
		case '*':
		case '/':
		case '+':
		case '-':
		case '(':
		case ')':
		case '=':
			return curr_tok=Token_value(ch);
		case '0':case '1':case '2':case '3':case '4':
		case '5':case '6':case '7':case '8':case '9':
			 input->putback(ch);
			 *input>>number_value;
			 return curr_tok=NUMBER;
		default:
			if(isalpha(ch))
			{
				string_value=ch;
				while(input->get(ch)&&isalnum(ch))string_value.push_back(ch);
				input->putback(ch);
				return curr_tok=NAME;
			}
			throw Syntax_error("bad token");
		}
}
void Driver::sta()
{
	while(*input){
		try
		{
			get_token();
			if(curr_tok==END)break;
			if(curr_tok==PRINT)continue;
			cout<<expr(false)<<endl;
		}
		catch(Zero_divide)
		{
			cerr<<"attempt to divide by zero\n";
			if(curr_tok!=PRINT)skip();
		}
		catch(Syntax_error e)
		{
			cerr<<"syntax error:"<<e.p<<endl;
			if(curr_tok!=PRINT)skip();
		}
	}
}
	
void Driver::skip()
{
	no_of_errors++;
	
	while(*input)
	{
		char ch;
		input->get(ch);
		
		switch(ch)
		{
		case '\n':
		case ';':
			return;
		}
	}
}
int main(int argc, char*argv)
{
	switch(argc)
	{
	case 1:
		input=&cin;
		break;
	case 2:
		input=new istringstream(argv);
		break;
	default:
		cerr<<"too many arguments\n";
		return 1;
	}
	sta();
	if(input!=&cin)delete input;
	return no_of_errors;
}
 Last edited by Michael on 2005-8-16 at 21:37 ]
作者: brglng     
时间: 2005-8-17 15:46
呵呵,我用VB编过一个。
作者: willsort     
时间: 2005-8-19 20:31
Re brglng:
      很好的代码,提三个建议:
      1、加入命令行参数支持,即在允许在命令行参数中写入表达式或者/?;
      2、set /p 的提示字符串可以写在 set 语句中,比如
          set /p SaveEval=是否将表达式和计算结果存入文件?
      3、if 语句中可以使用开关 /i 进行忽略大小写判断,比如:
          if /i "%SaveEval%"=="Y" goto save
          if /i "%SaveEval%"=="N" goto next
      另外,待代码完善后,我有意将它收入我的批处理收集帖 
{8905}《批处理编程的异类》,但是因为版面限制,可能会删除大部分的说明性文档代码,不知 brglng 兄是否同意?
 
作者: agboy888     
时间: 2005-8-20 01:20
不错,谢谢
作者: brglng     
时间: 2005-8-23 14:56
Originally posted by willsort at 2005-8-19 08:31 PM:
Re brglng:
      很好的代码,提三个建议:
      1、加入命令行参数支持,即在允许在命令行参数中写入表达式或者/?;
      2、set /p 的提示字笠... 
谢谢Willsort高手的建议。关于收录,我没什么意见,反正本来就是随便写写的。
 
作者: brglng     
时间: 2005-8-25 11:39
以下是根据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  
echo EvalExpr 
echo EvalExpr 
echo.
echo         : 要计算的表达式
echo       : 使用此参数将表达式和计算结果存入指定的文件
echo   : 非使用参数计算时总是将计算结果自动存入指定文件
echo                   注:文件路径将作为第二个参数,必须和/A参数配合使用。
echo             : 查看此帮助
echo        : 查看表达式书写方面的帮助
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=是否将表达式和计算结果存入文件?
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=
 
作者: defrag     
时间: 2005-8-26 00:54
用GW-BASIC编计算器并不是很难。。。
这个没测试过
没有错误处理
main.bas:
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
用QB7.1也可以(要用QBX运行,不能编译)
有错误处理
也没测试
main.bas:
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
 Last edited by defrag on 2005-8-30 at 19:41 ]
 
作者: willsort     
时间: 2005-8-26 11:28
Re Brglng:
      在结构上作了一些变化,让程序执行流程更加清晰,核心代码并为做出更改,请 Brglng 兄做一下测试吧。关于表达式用法帮助,我起初使用了 for 的语句以节省代码,但后来考虑到可读性的问题,最后舍弃了,你也可以一起测试一下。
:: 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 
echo   %0 
echo   %0 
echo.
echo           : 要计算的表达式
echo         : 使用此参数将表达式和计算结果存入指定的文件
echo      : 非使用参数计算时总是将计算结果自动存入指定文件
echo                 注:文件路径将作为第二个参数,必须和/A参数配合使用。
echo               : 查看命令行书写帮助
echo          : 查看命令行书写帮助与表达式书写帮助
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=是否将表达式和计算结果存入文件?
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
 Last edited by willsort on 2005-9-11 at 13:19 ]
 
作者: pfox     
时间: 2005-8-26 15:01
几位用其他语言编写的朋友,能不能随便编译成exe上传?
作者: defrag     
时间: 2005-8-27 16:43
说过,我那个只能在IDE(急成开发环境)里运行。。。
作者: brglng     
时间: 2005-8-31 12:57
谢谢Will Sort指点!
我又改进了一下代码:
:: 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  : 普通模式下运行时总是将计算结果自动存入指定文件。
echo   %0           : 普通模式下运行时只计算而不存入文件。
echo   %0           : 查看命令行书写帮助
echo   %0      : 查看命令行书写帮助与表达式书写帮助
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=是否将表达式和计算结果存入文件?
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
 
作者: willsort     
时间: 2005-9-11 13:33
作者: brglng     
时间: 2005-9-12 11:00
经测试完全正常,所有参数都可正常使用,暂时还没有发现什么不对。非常感谢Will Sort。
作者: zah98     
时间: 2006-10-24 08:04
不错,谢谢
作者: electronixtar     
时间: 2006-10-24 10:25
我来凑个热闹,呵呵
Eval.vbs
WScript.Echo Eval(WScript.Arguments(0))
运行
cscript //NoLogo Eval.vbs 3.1415926*2E5
返回
628318.52
成功,yeah!
或者不用输入参数,交互式输入的:
WScript.Echo Eval(WScript.StdIn.ReadLine)
 Last edited by electronixtar on 2006-10-24 at 10:31 AM ]
 
作者: lxmxn     
时间: 2006-10-24 11:08
  嘿嘿,多谢 electronixtar 兄,又学一招了,继续~支持~
作者: cxq5173     
时间: 2006-10-24 13:04
学习了
作者: karl0000     
时间: 2006-10-29 11:27
好东西,谢谢