Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 批处理脚本在IF语句中失败_Windows_Batch File_If Statement - Fatal编程技术网

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)


请阅读堆栈溢出文档页面。请阅读堆栈溢出文档页面。