批处理文件额外迭代到只有一个标签

时间:2016-01-18 22:11:52

标签: windows batch-file

很抱歉这个长度,但我得到的错误可能包含了我的所有代码。

我创建了两个文件,一个(rngInputTest)启动并检查执行循环,并通过call命令中的参数将四个变量传递给第二个(rngCompare)文件。

然后第二个文件获取四个参数并将它们保存到rngCompare本地的四个变量,然后使用%random%两次。之后,它将两个新变量(rng1和rng2)设置为比较var,方法是将它们加在一起并将比较传递回rngInputTest,并将参数保存到var结果中。

然后rngInputTest进行最后的检查,如果checkLoop var为2则转到最终的标签/函数(rngInputTestDisplay),它起作用,它回应结果很好。

我遇到的问题是,如果没有我的解决方法,在rngInputTestDisplay运行一次之后第二次执行rngInputTestDisplay(没有调用其他标签/函数,第二次运行rngInputTestDisplay时它会清空结果var) )

我目前的解决方法是

IF %checkLoop%==%logicIII% goto :end

我将它放在rngInputTestDisplay的开头,它会停止额外的迭代。

没有解决方法,即使放入:

echo in [label]
pause

在所有标签/函数中,在rngInputTest和rngCompare中,我仍然无法弄清楚额外的迭代是如何发生的,虽然我注意到执行只循环到rngInputTestDisplay,但没有执行任何先前的标签。 / p>

这两个文件的最终目标是创建一个可重复使用的随机数,这样我就可以多次调用第一个数据并将不同的数据集传递给它,然后将该数据返回给'main'文件。我知道我可以使用%random%一次并保存自己的头痛但是在使用它之后它并没有真正感觉到随机

我已将这两个文件包括在

之下

rngInputTest.bat

@ECHO off
    ::increment the loop-check var
set /a checkLoop+=1
goto :initLoopCheck

    ::used to check for looping
:initLoopCheck

    ::before execution loops to rngCompare
set logicI=1 
    ::after execution loops back from rngCompare
set logicII=2 
    ::used in rngInputTestDisplay,phantom loop
set logicIII=3 

    ::starts the initial loop
IF %checkLoop%==%logicI% goto :rngInputTestInitVarSet

    ::checks if code has looped back from rngCompare.bat
IF %checkLoop%==%logicII% goto :logic

    ::sets all the non-increment variables
:rngInputTestInitVarSet

    ::min-max's for use in rngCompare.bat :randomGen
set minI=0
set maxI=50
set minII=0
set maxII=50
goto :logic

    ::checks to see how far checkLoop has incremented
:logic
IF %checkLoop%==%logicI% goto :rngInputTestPass
IF %checkLoop%==%logicII% goto :rngInputTestDisplay

    ::passes min-max's to rngCompare via parameters
:rngInputTestPass
set checkLoop+=1
call rngCompare.bat %minI% %minII% %maxI% %maxII%
goto :rngInputTestDisplay

:rngInputTestDisplay

    ::this IF is important
    ::without it the code would loop..only to 
    :: :rngInputTestDisplay
    ::which causes result to be empty
IF %checkLoop%==%logicIII% goto :end

set /a checkLoop+=1
set result=%~1
echo result:%result%
pause
:end

rngCompare.bat

@ECHO off
goto :rngCompareInitVarSet

::initial variable set
:rngCompareInitVarSet
set MaxI=0
set MaxII=0
set MinI=0
set MinII=0
set result=0
goto :afterPass

::after rngInputTestPass
:afterPass
set MinI=%~1
set MinII=%~2
set MaxI=%~3
set MaxII=%~4
goto :randomGen


::generate two random numbers
:randomGen
::gets two random numbers from the variables passed from rngInputTest.bat
set /a rngI=(%RANDOM%*%MaxI%/32768)+%MinI%
set /a rngII=(%RANDOM%*%MaxII%/32768)+%MinII%
goto :compareRNG

::add the two rng numbers
:compareRNG
::adds the two numbers together
set /a compare=%rngI%+%rngII%
goto :passToRNGInputTest

::pass the compare var back to rngInputTest
:passToRNGInputTest
call rngInputTest.bat %compare% 

1 个答案:

答案 0 :(得分:0)

太复杂了。您不必来回传递值。您已经在环境变量中设置了它们,并且第二个批处理文件在同一个环境中运行,因此一个中更新的任何内容都可供另一个使用。

例如,这两个简单的批处理文件将显示值可用。

myFirst.bat

@echo off

set /a myVal1=1
set /a myVal2=2
set /a myVal3=3
set /a myVal4=4

call mySecond.bat

echo my updated values from second batch
echo %myVal1%
echo %myVal2%
echo %myVal3%
echo %myVal4%

pause

mySecond.bat

@echo off

echo my values created in first batch
echo %myVal1%
echo %myVal2%
echo %myVal3%
echo %myVal4%

set /a myVal1=%myVal1%+%Random%
set /a myVal2=%myVal2%+%Random%
set /a myVal3=%myVal3%+%Random%
set /a myVal4=%myVal4%+%Random%

pause

如果您不止一次拨打第二个,只需让它结束,不要再次调用第一个文件。当第二个蝙蝠完成后,它将从Call返回到第一个文件。

enter image description here