Windows 批处理脚本在IF语句中失败
我的批处理脚本在Windows 批处理脚本在IF语句中失败,windows,batch-file,if-statement,Windows,Batch File,If Statement,我的批处理脚本在:nbig的第二个状态下失败。(我在每条语句后使用@echo发现了这一点)。但是,如果正常运行,if中的SET语句会成功,内部带有@echo的if语句也会成功。这很奇怪,我看不出我做错了什么 我的代码在这里: :: Set the day and night values set /A nighttemp = 2700 set /A daytemp = 6500 :: Set Transition Duration set /A transitionduration = 60
:nbig
的第二个状态下失败。(我在每条语句后使用@echo
发现了这一点)。但是,如果正常运行,if
中的SET
语句会成功,内部带有@echo
的if
语句也会成功。这很奇怪,我看不出我做错了什么
我的代码在这里:
:: 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
显示temp
的值,但它会出错
(旁白:这是使用自定义时间运行红移程序…批处理分析器必须在SET/A命令之前解析开括号和闭括号,因此SET/A中的结束括号将应用于SET/A之前的开始括号
您可能需要在计算中转义结束参数
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%" )
但是,也许最简单的解决方案是完全抛弃外部paren——它们不是您构建代码的方式所需要的
if %mins% LSS %tdaywindow% SET /A "temp = (%daytemp% - %nighttemp%)*((%mins% - %tday%)/60) + %nighttemp%"
即使最后一个表单不需要它们,我仍然喜欢将我的SET赋值括在引号中
与错误无关,您可以通过使用SET/A功能进一步简化代码,该功能可以自动扩展数值变量,而无需%
或代码>(仅适用于SET/A)
批处理解析器必须在SET/A命令之前解析开括号和闭括号,因此SET/A中的结束括号将应用于SET/A之前的开始括号
您可能需要在计算中转义结束参数
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%" )
但是,也许最简单的解决方案是完全抛弃外部paren——它们不是您构建代码的方式所需要的
if %mins% LSS %tdaywindow% SET /A "temp = (%daytemp% - %nighttemp%)*((%mins% - %tday%)/60) + %nighttemp%"
即使最后一个表单不需要它们,我仍然喜欢将我的SET赋值括在引号中
与错误无关,您可以通过使用SET/A功能进一步简化代码,该功能可以自动扩展数值变量,而无需%
或代码>(仅适用于SET/A)
请阅读堆栈溢出文档页面。请阅读堆栈溢出文档页面。