【问题标题】:Multiple Variables - Generator多变量 - 生成器
【发布时间】:2015-12-04 16:37:57
【问题描述】:

我正在尝试创建一个 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

小时没有如果 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

【问题讨论】:

  • 如果您尝试使用 2 个其他 var 的值设置 1 个 var 或显示 2 个 var,请使用正确数量的 % 编写它。 IE。 if %H%%num% ...set /a Thr=%H%%num%+%Thr% 代替。每个变量在 2 %.
  • 如果Thr=2 H3=4 Num=3 那么我想要一种方法,这样我就可以更改if %H%num%% GTR 0 set /a Thr=%H%num%%+%Thr% 所以它读取If 4 GTR 0 set /a THR=4+2
  • @Paul:OP 没有尝试将 1 个变量设置为 2 个其他变量的值,也没有显示 2 个变量,而是访问一个 数组元素set /a Thr=!H%num%!+%Thr%

标签: variables batch-file cmd dos


【解决方案1】:

你的代码中有几点需要调整:

.

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 我知道它说不要但 +2
【解决方案2】:

您需要延迟扩展:

setlocal enabledelayedexpansion
set h1=3
set x=1
echo !h%x%!

EDIT 以在您的评论中显示它如何与示例一起使用:

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%being 3:

!H3!

正在扩展为:

4

用户 jebHow does the Windows Command Interpreter (CMD.EXE) parse scripts? 写了一个很好的答案(很难理解,但有助于理解发生了什么)

【讨论】:

  • 我想这么if Thr=2 H3=4 Num=3 然后我想要一种方法,这样我就可以改变if %H%num%% GTR 0 set /a Thr=%H%num%%+%Thr% 所以它显示如果4 GTR 0 set /a THR=4+2
【解决方案3】:

如果您正在寻找解析时间和计算持续时间的公式,您可能会看到:Calculate Time difference in Windows batch file

【讨论】:

  • 时间到了,但是从 hh:mm:ss.ms 的转换已经完成,只需要找到一种方法使 %h%num%% 变为 = %h1% 等于一个数字跨度>
  • 问题不在于时差,而恰恰相反:加几次...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多