如何在cmd中设置一个变量等于另外2个变量的总和

How to set one variable equal to the sum of 2 other variables in cmd

我的密码是

FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
   IF "%%~L"== "" goto s_done
      Set _yyyy=%%L
      Set _mm=00%%J
      Set /a _nextmm=_mm+1
)
:s_done

我要的是这个变量“_nextmm”=这个变量“_mm”+1

但是当我运行这个代码。结果是

IF "2021" == "" goto s_done
Set _yyyy = 2021
Set _mm = 008
Set /a _nextmm = _mm+1

我打电话给echo %_nextmm%。结果是 1 而不是 009.

我这里做错了什么?

我希望在您实际的 set 命令行中等号周围没有 SPACE,因为它们会造成伤害。最好的方法是这种语法:

rem /* No spaces around `=`-sign, and quotes around the whole assignment expression,
rem    which avoids unwanted training whitepsaces and protects special characters;
rem    without assigning the quotes themselves to the variable value: */
set "VAR=Value"

无论如何,使用:

set /A "_nextmm=%%J+1"

而不是 set /A _nextmm=_mm+1,因为(正如我假设的那样)%%J8,这是一个正确的十进制数,但是 _mm008 ,由于前导零 ,它被视为 八进制数(是的,我知道,这不直观,但请看一下 this),这是无效的只有数字 07,因此 0 被用于进一步的算术运算。


如果您的 echo 命令行 位于 循环体 for /F 中(因此在结束 ) 之前),请使用:

for /F … (
    …
    call echo %%_nextmm%%
)

或使用delayed variable expansion:

setlocal EnableDelayedExpansion
for /F … (
    …
    echo !_nextmm!
)
endlocal

如果您的 echo 命令行 for /F 循环体的 之外(所以在结束 ) 之后),正常或立即扩展将按预期工作:

for /F … (
    …
)
echo %_nextmm%

TBH,我不确定你的逻辑,因为如果这是在 2021 年 12 月完成的,那么加 1 会使月份不正确 13,年份将保持为 2021 .

出于这个原因,如果您只是使用 PowerShell 而不是 WMIC 来帮助您,那就更好了。 PowerShell 将日期视为对象而不是字符串,因此您可以直接执行数学运算以定义变量所需的值。

For /F "Tokens=1-2" %%G In ('
 %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoLogo -NoProfile
 -Command "(Get-Date).AddMonths(1).ToString('yyyy MM')"') Do (Set "_yyyy=%%G"
    Set "_MM=%%H")

如果您想在不拆分行的情况下这样做以便更好地阅读,那么:

For /F "Tokens=1-2" %%G In ('%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoLogo -NoProfile -Command "(Get-Date).AddMonths(1).ToString('yyyy MM')"') Do Set "_yyyy=%%G" & Set "_MM=%%H"