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 语句有问题,有谁知道我应该如何更改它?

谢谢!

4

1 回答 1

1

问题 1 - 变量的正常扩展与延迟扩展
正常扩展 using%var%发生在解析时,整个 IF 语句被一次性解析,包括括号内的内容。因此echo (%usertimeouthours%),在执行 IF 语句之前(在 SET /P 设置值之前)显示 USERTIMEOUTHOURS 的值。

解决方法是在顶部启用延迟扩展,使用setlocal enableDelayedExpansion和 use!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
于 2012-08-09T04:29:22.340 回答