从批处理脚本中的变量中减去数字

Sha*_*ank 1 batch-file subtraction

我是批处理脚本的新手,所以请宽容地对待这个问题。当我从“TodayDay”变量中减去 1 时,该值没有更新。下面是该行。

set /a "TodayDay=%TodayDay%-1"
Run Code Online (Sandbox Code Playgroud)

我的用例是查找今天的日期是否小于“lastOpenedDate”变量,我想将“lastOpenedDate”设置为昨天的日期

set lastOpenedDate=2017-12-22
IF %TodayYear%-%TodayMonth%-%TodayDay% LSS %lastOpenedDate% (   
  echo Before Subtraction TodayDay is %TodayDay%
  set /a "TodayDay=%TodayDay%-1"
  echo After Subtraction TodayDay is %TodayDay%
)
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,输​​出是:

Before Subtraction TodayDay is 20
After Subtraction TodayDay is 20
Run Code Online (Sandbox Code Playgroud)

我从下面提到的代码中得到了其他变量值

for /F "skip=1 delims=" %%F in ('
    wmic PATH Win32_LocalTime GET Day^,Month^,Year /FORMAT:TABLE
') do (
    for /F "tokens=1-3" %%L in ("%%F") do (
        set TodayDay=0%%L
        set TodayMonth=0%%M
        set TodayYear=%%N
    )
)
set TodayDay=%TodayDay:~-2%
set TodayMonth=%TodayMonth:~-2%
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Mag*_*goo 7

您需要使用顶部栏搜索 SO delayed expansion。这是#1 常见问题解答。

改变

  set /a "TodayDay=%TodayDay%-1"
  echo After Subtraction TodayDay is %TodayDay%
)
Run Code Online (Sandbox Code Playgroud)

  set /a "TodayDay=%TodayDay%-1"
)
echo After Subtraction TodayDay is %TodayDay%
Run Code Online (Sandbox Code Playgroud)

一旦你熟悉了,这就会有意义delayed expansion.

现在您将遇到的下一个问题(直到该月的 8 号或 9 号才会出现)是批处理中的前导0意味着“八进制”,所以 - 您实际上需要

  set /a "TodayDay=1%TodayDay%-1"
)
set "TodayDay=%TodayDay:~-2"
echo After Subtraction TodayDay is %TodayDay%
Run Code Online (Sandbox Code Playgroud)

通过在日期数字前面加上 100 1,然后您需要获取最后 2 个字符。

  • @Shashank,此代码在闰日或当您减去新月份时不起作用。如果日期是 2017 年 12 月 1 日,并且您从当天减去 1,则不会得到 30,因为那是 11 月的最后一天。2020 年 3 月 1 日,它不会为您提供 2 月份的 29。 (3认同)