2017-08-31 116 views
0

我正在尝试查找批处理脚本中最大的4个数字,但它不起作用。在Windows批处理脚本中查找4个数字中最大的一个

GTR命令没有执行。

从这一行它永远不会被执行if !Counter_Senior! gtr !Max_Age! (

我是新来的一批脚本,我不知道对齐和间距。请帮助我通过。

echo off 
setlocal enabledelayedexpansion 

set /a Counter_Child=1 
set /a Counter_Senior=2 
set /a Counter_Older_adult=0 
set /a Counter_Young_adult=3 
set /a Max_Age=%counter_Child% 

echo maximum age is %Max_Age% 

if !Counter_Senior! gtr !Max_Age! (
    set Max_Age=%Counter_Senior% 
    if !Counter_Older_adult! gtr !Max_Age! (
     set Max_Age=%Counter_Older_adult% 
     if !%Counter_Young_adult! gtr !Max_Age! (
      set Max_Age=%Counter_Young_adult% 
      time /t 
      echo Maximum age is %Max_Age% 
      goto:EOF 
     ) 
    ) 
) 

if !Counter_Older_adult! gtr !Max_Age! (
    set %Max_Age%=%Counter_Older_adult% 
    if !%Counter_Young_adult! gtr !Max_Age! (
     set %Max_Age%=%Counter_Young_adult% 
     echo Maximum age is %Max_Age% 
     goto:EOF 
    ) 
) 

if !%Counter_Young_adult! gtr !Max_Age! (
    set %Max_Age%=%Counter_Young_adult% 
    echo Maximum age is %Max_Age% 
    goto:EOF 
) 

echo Maximum age is %Max_Age% 

goto:EOF 
+0

我在脚本中添加了一些缩进和空行来帮助提高可读性。我没有改变它的任何内容! – Compo

回答

1

你的代码看起来太复杂了。试试这个:

echo off 
set Counter_Child=1 
set Counter_Senior=2 
set Counter_Older_adult=0 
set Counter_Young_adult=3 
set Max_Age=%Counter_Child% 
IF %Counter_Senior% GTR %Max_Age% SET Max_Age=%Counter_Senior% 
IF %Counter_Older_adult% GTR %Max_Age% SET Max_Age=%Counter_Older_adult% 
IF %Counter_Young_adult% GTR %Max_Age% SET Max_Age=%Counter_Young_adult% 
echo maximum age is %Max_Age% 
+0

这是提出的问题的最简单的解决方案。它不会很好地检查例如四百年,但它足够满足需要,并且只需要四行代码来计算最大年龄。 – paxdiablo

0

有(至少)两个问题与您的代码:

  • 您正在使用goto:EOF一个if内,并且退出整个批处理文件。
  • 在一些地方错误地使用set %Max_Age%=..代替set Max_Age=..

你的代码也过于复杂,并且可以降低到更简单的东西像张贴MichaelS答案。

如果你要打印的具体信息时做出改变,你可以使用一个通用的子过程:

@echo off 
goto Start 

:CheckAge 
setlocal enableextensions enabledelayedexpansion 
set newage=!%1! 
if %newage% gtr %Max_Age% (
    echo %1 is older than %Max_Age%, the new maximum is %newage% 
    set Max_Age=%newage% 
) 
endlocal & set Max_Age=%Max_Age% 
goto :EOF 

:Start 
set Counter_Child=1 
set Counter_Senior=2 
set Counter_Older_adult=0 
set Counter_Young_adult=3 
set Max_Age=0 

call :CheckAge Counter_Child 
call :CheckAge Counter_Senior 
call :CheckAge Counter_Older_adult 
call :CheckAge Counter_Young_adult 
echo Maximum age is %Max_Age% 
1

如果只想四个计数器变量的最大值,那么你可以使用这个:

For /F "Tokens=2 Delims==" %%A In ('Set Counter_' 
) Do If %%A GEq !Max_Age! Set/A Max_Age=%%A 

[编辑]
和通过Anders提出的方案...

For %%A In (
    %Counter_Child% %Counter_Senior% %Counter_Older_adult% %Counter_Young_adult% 
) Do If %%A GEq !Max_Age! Set/A Max_Age=%%A 
+0

如果您不控制外部环境,那么有人会在运行批处理文件以改变其行为之前执行“Set Counter_Evil = 99”,这是有问题的。 – Anders

+0

当然他们可以,_(我没有选择变量名,它们已经被赋予了)_但是我建议你可以对使用'Set'语句的几乎任何脚本发表评论。我的建议是,实际的最终产品会使用输入数据_传播这些值(否则它的用途很小),所以最终用户可能无论如何都可以控制它们。另外创建另一个变量'Counter_'只会停止返回正确答案,如果您不希望它输出正确的答案,那么运行脚本没有任何好处。 – Compo

相关问题