多变量 - 生成器

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

用户 jebHow 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