IF语句

时间:2016-12-07 05:08:35

标签: windows batch-file if-statement

我的批处理脚本在if的第二个:nbig状态失败。 (我在每个语句后使用@echo发现了这一点)。但是,SET中的if语句如果正常运行则会成功,内部有if的{​​{1}}语句也会成功。这非常奇特,我看不出我做错了什么。

我的代码在这里:

@echo

正确运行的程序应该:: Set the day and night values set /A nighttemp = 2700 set /A daytemp = 6500 :: Set Transition Duration set /A transitionduration = 60 :: Set times in minutes from midnight set /A tnight = 1380 set /A tday = 480 For /f "tokens=1-4 delims=/:." %%a in ("%TIME%") do ( SET /A HH24=%%a SET /A MI=%%b SET /A SS=%%c SET /A FF=%%d ) SET /A mins = %HH24%*60 + %MI% SET /A tdaywindow = %tday% + 60 SET /A tnightwindow = %tnight% + 60 if %tnight% GEQ %tday% ( GOTO NBIG) if %tnight% LSS %tday% ( GOTO DBIG) pause :NBIG if %mins% LSS %tday% ( SET /A temp = %nighttemp% ) if %mins% LSS %tdaywindow% ( SET /A temp = (%daytemp% - %nighttemp%)*((%mins% - %tday%)/60) + %nighttemp% ) if %mins% LSS %tnight%( SET /A temp = %daytemp% ) if %mins% LSS %tnightwindow%( SET /A temp = (%nighttemp% - %daytemp%)*((%mins% - %tnight%)/60) + %daytemp% ) GOTO ENDING :DBIG if %mins% LSS %tnight%( SET /A temp = %daytemp% ) if %mins% LSS %tnightwindow% ( SET /A temp = (%nighttemp% - %daytemp%)*((%mins% - %tnight%)/60) + %daytemp%) if %mins% LSS %tday% ( SET /A temp = %nighttemp% ) if %mins% LSS %tdaywindow% ( SET /A temp = (%daytemp% - %nighttemp%)*((%mins% - %tday%)/60) + %nighttemp% ) GOTO ENDING :ENDING @echo %temp% pause ::%~dp0\redshift.exe -O %temp% @echo的值,但是它会出错。

(旁白:这是用自定义时间运行redshift程序......)

1 个答案:

答案 0 :(得分:2)

批处理解析器必须在SET / A命令之前解析打开和关闭的括号,因此SET / A中的关闭窗口将应用于 SET / A之前的开始paren

你需要在计算中逃避关闭的parens

if %mins% LSS %tdaywindow% ( SET /A temp = (%daytemp% - %nighttemp%^)*((%mins% - %tday%^)/60^) + %nighttemp% )

或者更好的是,将整个作业括在引号中:

if %mins% LSS %tdaywindow% ( SET /A "temp = (%daytemp% - %nighttemp%)*((%mins% - %tday%)/60) + %nighttemp%" )

但也许最简单的解决方案就是彻底抛弃外部问题 - 不需要按照构建代码的方式使用它们。

if %mins% LSS %tdaywindow% SET /A "temp = (%daytemp% - %nighttemp%)*((%mins% - %tday%)/60) + %nighttemp%"

即使最后一个表单不需要它们,我仍然希望将我的SET赋值括在引号中。

与错误无关,您可以使用自动扩展数字变量的SET / A功能进一步简化代码,而无需%!(仅适用于SET / A)

if %mins% LSS %tdaywindow% SET /A "temp = (daytemp - nighttemp)*((mins - tday)/60) + nighttemp"