我的批处理脚本在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程序......)
答案 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"