如何在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
,因为(正如我假设的那样)%%J
是 8
,这是一个正确的十进制数,但是 _mm
是 008
,由于前导零 ,它被视为 八进制数(是的,我知道,这不直观,但请看一下 this),这是无效的只有数字 0
到 7
,因此 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"
我的密码是
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
,因为(正如我假设的那样)%%J
是 8
,这是一个正确的十进制数,但是 _mm
是 008
,由于前导零 ,它被视为 八进制数(是的,我知道,这不直观,但请看一下 this),这是无效的只有数字 0
到 7
,因此 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"