2012-08-09 55 views
2

我正在接受输入并做一些简单的数学运算的短批处理文件程序。它似乎对除第一个回声以外的所有内容都正确工作。下面是代码:简单的批处理文件如果()失败

set /p usercommand= "Input:" 
if "%usercommand%" equ "done" (

set /p usertimeouthours= "Input Hours: " 
echo (%usertimeouthours%) 

set /p usertimeoutminutes= "Input Minutes: " 
echo (%usertimeoutminutes%) 

set /p usertimeoutseconds= "Input Seconds: " 
echo (%usertimeoutseconds%) 

set /a answer= %usertimeouthours%*3600+%usertimeoutminutes%*60+%usertimeoutseconds% 
echo %answer% 

goto end 
) else (
echo finished 
goto user 
) 
:end 

为什么第一回波只能输出

我的猜测是,什么是错的我的if语句,没有人知道我应该怎么改它?

谢谢!

回答

1

问题1 - 正常与变量的延迟扩展
正常扩展使用%var%发生在解析时间,并且整个IF语句一次全部解析,包括括号内的内容。因此,像echo (%usertimeouthours%)这样的东西显示USERTIMEOUTHOURS的值,因为它在执行IF语句之前已存在(在SET/P设置值之前)。

修复方法是使用setlocal enableDelayedExpansion在顶部启用延迟扩展,并使用!var!而不是%var%。延迟扩展发生在执行时间而不是解析时间。

问题2 - 转义的特殊字符
有一些有特殊含义的,并且必须是字符要么逃脱^或者,如果你想的字符被视为一个字符串字面引用。

其中一个特殊字符是)。它将终止任何以(打开的代码块,除非它被转义或引用。当您在ECHO语句中使用它时,您需要将该字符转义为^),因为这些语句位于带括号的代码块中。

简化您的SET/A声明
你不需要在SET/A的计算使用时扩展变量。你可以简单地使用变量名而不用百分数或感叹号。这种便利只适用于SET/A。

@echo off 
setlocal enableDelayedExpansion 
set /p usercommand= "Input:" 
if "%usercommand%" equ "done" (

    set /p usertimeouthours= "Input Hours: " 
    echo (!usertimeouthours!^) 

    set /p usertimeoutminutes= "Input Minutes: " 
    echo (!usertimeoutminutes!^) 

    set /p usertimeoutseconds= "Input Seconds: " 
    echo (!usertimeoutseconds!^) 

    set /a answer= usertimeouthours*3600+usertimeoutminutes*60+usertimeoutseconds 
    echo !answer! 

    goto end 
) else (
    echo finished 
    goto user 
) 
:end 
+0

首先是梦幻般的答案。其次,我明白执行何时发生,但什么时候解析发生?换句话说,你可以给我一个简短的解释批处理文件的运行方式吗?你可以在评论中回应,或者我可以问它作为另一个问题,如果你想代表它;) – jth41 2012-08-09 04:56:48

+1

@John - 你问它:-)看看[jeb的回答](http://stackoverflow.com/ a/4095133/1012053)的问题“Windows命令解释器(CMD.EXE)如何解析脚本?” – dbenham 2012-08-09 05:24:57

+0

那个链接正是我所需要的。非常感谢。也在一个完全不相关的说明。我只是看着你的个人资料,你给出了非常好的答案..但你几乎从不问问题为什么? – jth41 2012-08-09 05:45:49