多变量 - 生成器
Multiple Variables - Generator
我正在尝试创建一个 1 行代码,它将所有变量相加,这很难在文本中正确解释,但这是代码的一小部分
H = hours
M = Minutes
Thr = Total Hours
Tmin= Total Minutes
Call data.bat
Rem data.bat is all the h1,m1,h2,m2,h3,m3... info
Rem Example Data
H1=3
M1=53
H2=4
M2=20
Set num=1
:refresh
if %H%num%% GTR 0 set /a Thr=%H%num%%+%Thr%
if %M%num%% GTR 0 set /a Thr=%M%num%%+%TMin%
if %M%num%% EQU 0 Goto :total
set /a number=%number%+1
goto :refresh
:Total
set /a Total=((%Thr%*60)+%Tmin%)
set /a TotalHour=(%Total%/60)
set /a TotalMin=(-%TotalHour%*60)+%Total%
if %Totalmin% GEQ 0 if %Totalmin% LEQ 9 set Totalmin=0%Totalmin%
Echo Duration : %TotalHour%hr %TotalMin%min
小时数没有 if 0 转到总计,因为可能有 0 小时但有 ## 分钟的时间
关于如何做到这一点的任何想法?
运行 原样给了我
分步操作
if %h%num%% gtr 0 set /a Thr=%h%num%%+%thr%
If %h1% gtr 0 set /a thr=%h1%+%thr%
If 3 gtr 0 set /a thr=**3+%thr%
if 3 gtr 0 set /a thr=3+1
您需要延迟扩展:
setlocal enabledelayedexpansion
set h1=3
set x=1
echo !h%x%!
编辑 以显示它如何与您评论中的示例一起使用:
setlocal enabledelayedexpansion
set Thr=2
set H3=4
set Num=3
REM echo if !H%Num%! GTR 0 set /a Thr=!H%num%!+%Thr%
echo if !H%Num%! GTR 0 set /a Thr+=!H%num%!
REM if !H%Num%! GTR 0 set /a Thr=!H%num%!+%Thr%
if !H%Num%! GTR 0 set /a Thr+=!H%num%!
echo %Thr%
(注意:预期的行是多余的,只是为了显示,会发生什么)
我使用不同的语法向变量添加值;注释掉你的语法。两个版本的工作原理相同。
%h%num%%
将被解释为(插入下划线以显示,解析器如何对其进行分组):
%h%_num_%%
%h%
(可能)未定义(下面显示为 ~),%%
被解释为转义的单个文字 %
,导致:
~_num_%
或没有占位符:
num%
与延迟扩展相同:
!H%Num%!
%num%
3:
!H3!
正在扩展为:
4
用户 jeb 对 How does the Windows Command Interpreter (CMD.EXE) parse scripts? 写了一个很好的答案(很难,但有助于理解发生了什么)
如果您正在寻找解析时间和计算持续时间的公式,您可能会这样看:Calculate Time difference in Windows batch file
你的代码有几点需要调整:
- 通过索引访问数组元素的正确方法是使用延迟扩展,如Arrays, linked lists and other data structures in cmd.exe (batch) script中的完整解释:
.
if !H%num%! GTR 0 set /a Thr=!H%num%!+%Thr%
- 然而,
set /a
命令可以在只给出变量名的情况下直接访问数组元素,所以在这种情况下没有必要扩展值:
.
set /a Thr=H%num%+Thr
set /a number=number+1
最后一行也可以这样写:
set /a number+=1
- 如果你想检查一个变量是否不存在(而不是将它与零值变量混淆),你可以使用
if defined
命令:
.
if defined H%num% goto refresh
- 您多次使用了错误的变量名称:
number
而不是 num
,以及 分钟 计算中的 Thr
。
.
这是完成之前修改后的最终代码:
@echo off
REM H = hours
REM M = Minutes
REM Thr = Total Hours
REM Tmin= Total Minutes
REM Call data.bat
Rem data.bat is all the h1,m1,h2,m2,h3,m3... info
Rem Example Data
set H1=3
set M1=53
set H2=4
set M2=20
Set num=1
:refresh
set /a Thr=H%num%+Thr
set /a Tmin=M%num%+Tmin
set /a num=num+1
if defined M%num% Goto :refresh
:Total
set /a Total=((Thr*60)+Tmin)
set /a TotalHour=(Total/60)
set /a TotalMin=(-TotalHour*60)+Total
if %Totalmin% LEQ 9 set Totalmin=0%Totalmin%
Echo Duration : %TotalHour%hr %TotalMin%min
输出:
Duration : 8hr 13min
我正在尝试创建一个 1 行代码,它将所有变量相加,这很难在文本中正确解释,但这是代码的一小部分
H = hours
M = Minutes
Thr = Total Hours
Tmin= Total Minutes
Call data.bat
Rem data.bat is all the h1,m1,h2,m2,h3,m3... info
Rem Example Data
H1=3
M1=53
H2=4
M2=20
Set num=1
:refresh
if %H%num%% GTR 0 set /a Thr=%H%num%%+%Thr%
if %M%num%% GTR 0 set /a Thr=%M%num%%+%TMin%
if %M%num%% EQU 0 Goto :total
set /a number=%number%+1
goto :refresh
:Total
set /a Total=((%Thr%*60)+%Tmin%)
set /a TotalHour=(%Total%/60)
set /a TotalMin=(-%TotalHour%*60)+%Total%
if %Totalmin% GEQ 0 if %Totalmin% LEQ 9 set Totalmin=0%Totalmin%
Echo Duration : %TotalHour%hr %TotalMin%min
小时数没有 if 0 转到总计,因为可能有 0 小时但有 ## 分钟的时间 关于如何做到这一点的任何想法? 运行 原样给了我
分步操作
if %h%num%% gtr 0 set /a Thr=%h%num%%+%thr%
If %h1% gtr 0 set /a thr=%h1%+%thr%
If 3 gtr 0 set /a thr=**3+%thr%
if 3 gtr 0 set /a thr=3+1
您需要延迟扩展:
setlocal enabledelayedexpansion
set h1=3
set x=1
echo !h%x%!
编辑 以显示它如何与您评论中的示例一起使用:
setlocal enabledelayedexpansion
set Thr=2
set H3=4
set Num=3
REM echo if !H%Num%! GTR 0 set /a Thr=!H%num%!+%Thr%
echo if !H%Num%! GTR 0 set /a Thr+=!H%num%!
REM if !H%Num%! GTR 0 set /a Thr=!H%num%!+%Thr%
if !H%Num%! GTR 0 set /a Thr+=!H%num%!
echo %Thr%
(注意:预期的行是多余的,只是为了显示,会发生什么) 我使用不同的语法向变量添加值;注释掉你的语法。两个版本的工作原理相同。
%h%num%%
将被解释为(插入下划线以显示,解析器如何对其进行分组):
%h%_num_%%
%h%
(可能)未定义(下面显示为 ~),%%
被解释为转义的单个文字 %
,导致:
~_num_%
或没有占位符:
num%
与延迟扩展相同:
!H%Num%!
%num%
3:
!H3!
正在扩展为:
4
用户 jeb 对 How does the Windows Command Interpreter (CMD.EXE) parse scripts? 写了一个很好的答案(很难,但有助于理解发生了什么)
如果您正在寻找解析时间和计算持续时间的公式,您可能会这样看:Calculate Time difference in Windows batch file
你的代码有几点需要调整:
- 通过索引访问数组元素的正确方法是使用延迟扩展,如Arrays, linked lists and other data structures in cmd.exe (batch) script中的完整解释:
.
if !H%num%! GTR 0 set /a Thr=!H%num%!+%Thr%
- 然而,
set /a
命令可以在只给出变量名的情况下直接访问数组元素,所以在这种情况下没有必要扩展值:
.
set /a Thr=H%num%+Thr
set /a number=number+1
最后一行也可以这样写:
set /a number+=1
- 如果你想检查一个变量是否不存在(而不是将它与零值变量混淆),你可以使用
if defined
命令:
.
if defined H%num% goto refresh
- 您多次使用了错误的变量名称:
number
而不是num
,以及 分钟 计算中的Thr
。
.
这是完成之前修改后的最终代码:
@echo off
REM H = hours
REM M = Minutes
REM Thr = Total Hours
REM Tmin= Total Minutes
REM Call data.bat
Rem data.bat is all the h1,m1,h2,m2,h3,m3... info
Rem Example Data
set H1=3
set M1=53
set H2=4
set M2=20
Set num=1
:refresh
set /a Thr=H%num%+Thr
set /a Tmin=M%num%+Tmin
set /a num=num+1
if defined M%num% Goto :refresh
:Total
set /a Total=((Thr*60)+Tmin)
set /a TotalHour=(Total/60)
set /a TotalMin=(-TotalHour*60)+Total
if %Totalmin% LEQ 9 set Totalmin=0%Totalmin%
Echo Duration : %TotalHour%hr %TotalMin%min
输出:
Duration : 8hr 13min