【问题标题】:Batch Script: Double Digit Number Less Than Single Digit批处理脚本:两位数小于一位数
【发布时间】:2018-01-24 21:25:30
【问题描述】:

我是批处理脚本的新手,不明白为什么两位数的计算结果小于一位数?

%weekdayOffPeakEnd% 变量在回显时为 7。

我从 FOR 循环(未显示)中调用此 sleepUntilOffPeak 函数,但我认为这不会产生任何影响,因为我没有在脚本中的其他任何地方使用此函数中的任何变量。此功能只是检查当前时间并“休眠”,直到电费再次变低。

谢谢

rem if not currently off-peak hours, wait (timeout) until electricity rates are lowest
:sleepUtilOffPeak
rem set DayofWeek and Hour variables
for /f %%a in ('wmic path win32_localtime get DayOfWeek /format:list ^| findstr "="') do (set %%a)
for /f %%a in ('wmic path win32_localtime get Hour /format:list ^| findstr "="') do (set %%a)
rem echo Day of week^: %DayOfWeek%
echo Hour^: %Hour%

rem set OffPeak variables
set /a weekdayOffPeakEnd=07
echo weekdayOffPeakEnd^: %weekdayOffPeakEnd%
set /a weekdayOffPeakStart=23
set /a weekendOffPeakEnd=15
set /a weekendOffPeakStart=19

set weekday=true
if "%DayOfWeek%" EQU "0" set weekday=false
if "%DayOfWeek%" EQU "6" set weekday=false
rem echo weekday^: %weekday%

if %weekday% equ true (
    echo Today is a weekday
    if Hour LSS weekdayOffPeakEnd (
        echo %Hour% is less than off-peak end^:  %weekdayOffPeakEnd%. Returning...
        exit /B 0
    ) else (
        if Hour GEQ weekdayOffPeakStart (
            echo %Hour% is greater than or equal to off-peak start^: %weekdayOffPeakStart%. Returning...
            exit /B 0
        ) else ( rem Hour is between 07 and 23
            rem sleep until offPeak then return
            set /a sleepTime=23-%Hour%
            set /a sleepSeconds=%sleepTime%*3600
            echo Going to sleep for %sleepSeconds% seconds
            timeout /t %sleepSeconds%
            exit /B 0
        )
    )
) else ( rem weekday equ false
    echo Today is a weekend
    if Hour LSS weekendOffPeakEnd (
        echo %Hour% is less than off-peak end^: %weekendOffPeakEnd%. Returning...
        exit /B 0
    ) else (
        if Hour GEQ weekendOffPeakStart (
            echo %Hour% is greater than or equal to off-peak start^: %weekendOffPeakStart%. Returning...
            exit /B 0
        ) else ( rem Hour is between 15 and 19
            rem sleep until offPeak then return
            set /a sleepHours=%weekendOffPeakStart%-%Hour%
            echo sleepHours^: %sleepHours%
            set /a sleepSeconds=%sleepHours%*3600
            echo Going to sleep for %sleepSeconds% seconds
            timeout /t %sleepSeconds%
            echo All done sleeping. Returning...
            exit /B 0
        )
    )
)

【问题讨论】:

  • 使用这个语法if %DayOfWeek% EQU 0 set weekday=false
  • 当您使用Set /A 时,请从变量名中删除所有周围的百分比。另一条建议是让您阅读延迟扩展。

标签: batch-file numbers compare


【解决方案1】:

你有很多这样的例子:

if Hour LSS weekdayOffPeakEnd (

这会将文字 Hour 与文字 weekdayOffPeakEnd 进行比较

你需要

if %Hour% LSS %weekdayOffPeakEnd% (

此外,如果您更改 代码块(带括号的代码)内的任何变量的值,那么您需要检索更改的值使用 !var! 已调用 delayed expansion(使用 search 定位许多 SO 项)

此外,您观察到set /a var=07 会将变量设置为7,而不是07。了解set /aset 之间的区别很重要。 set /a 解析要分配的值,然后将该值作为字符串分配给变量,抑制前导零。 set 分配包含前导零的文字。

这会导致两个后果。首先,以0 开头的值由set/a 分配为OCTAL 值,因此0809无效。其次,if %var% op val 将尝试将运算符的 both 参数转换为数字来执行比较,如果 both 转换都成功,则比较作为数字比较,否则作为字符串比较执行,其中字符从左侧开始连续匹配。

【讨论】:

  • 感谢您的指导并解释如何评估 if 语句。所有 if else 语句现在都在工作,我已经硬编码了 set /a sleepHours=7-Hour 语句以避免 07 被解释为八进制。不幸的是, sleepHours 没有分配任何值。请指教。
  • 您需要调用延迟扩展 [数百篇关于此的 SO 文章 - 使用搜索功能] 以显示或使用在括号中的指令系列中更改的任何变量的运行时值(又名“代码块”)。
  • 对不起,我应该提到;我已经在使用 SETLOCAL EnableDelayedExpansion。 sleepHours 变量不在其自己的代码块之外使用。它是在工作日或周末父代码块的最终 else 语句中创建和(未成功)设置的。以下都不会导致填充 sleepHours 变量:set /a sleepHours=23-Hour、set /a sleepHours=23-%Hour% 或 set /a sleepHours=23-!Hour!
  • 代码块从if %weekday% equ true ( 开始,到您发布的代码的最后一个) 终止。由于sleephours 是在set /a sleepHours=%weekendOffPeakStart%-%Hour% 块内分配的,因此对其内容的任何进一步引用都必须为!sleephours!%sleephours% 将有sleephours 的当前值替换在遇到整个块时。注意在set /a中,%var%指的是遇到块时变量的值,!var!它的当前值可能已经被修改了,&var也可以用来表示“当前值” "。
  • 非常感谢。你上面的最后一条评论触发了我大脑中的灯泡:)
猜你喜欢
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 2014-12-03
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多