Windows批处理文件循环在处理命令

时间:2015-07-02 21:59:58

标签: windows batch-file cmd

我创建了以下批处理文件,它使Wait“| / - \”动画。我想在处理mysql restore database命令mysql -u %DBuser% -p %DB% < "%thefile%" 时使用它,其中thefile是sql转储文件路径

@Echo OFF
setlocal EnableDelayedExpansion
for /f %%a in ('copy /Z "%~f0" nul') do set "CR=%%a"
SET p=-1
set num=1
set "st[1]=| "
set "st[2]=/ "
set "st[3]=--"
set "st[4]=\ "

if /i %p% lss 0 (
set p=2
call :LOOP
call :DoSomeThing
)
:LOOP
if /i %num% lss 4 (
set /a num=num+1
) else (
set num=1
)
<nul set /P "=Wait !st[%num%]!!CR!"

TIMEOUT /T 1 >NUL
GOTO :LOOP

:DoSomeThing
TIMEOUT /T 10 >NUL
echo Doing...

这里,:DoSomeThing用于测试目的,它应该被替换或包含mysql命令。我遇到:LOOP永远有效的问题,并且没有对:DoSomeThing

的调用

我在调用:DoSomeThing之前尝试调用:LOOP但是在DoSomeThing完成后LOOP开始因此变得无用!有什么方法可以让DoSomeThing或MySQL命令在后台工作,同时动画等待循环也可以工作吗?

1 个答案:

答案 0 :(得分:2)

编辑添加了一些解释

为了满足您的请求,必须同时执行两个线程,因此一个线程执行mysql命令,另一个线程执行循环等待动画。两个线程都可以使用在mysql执行开始之前创建的标志文件进行同步,并在结束后删除,因此等待动画将循环,直到标记文件被删除。

创建新线程的方法是通过start命令,该命令可以运行第二个执行mysql命令的Batch文件并删除该标志文件。但是,为了将所有代码保存在同一位置,start命令可以运行相同的批处理文件(在下面的代码中由"%~F0"表示)。允许此技巧工作的关键是特殊参数,它指示批处理文件是否从内部重新执行,因此在这种情况下代码只是转到执行mysql命令的部分并删除标志文件。

@Echo OFF

rem If the Batch file was re-executed with the special parameter (second thread)
rem go to the section that execute the mysql command
if "%~1" equ ":DoSomething" goto %1

setlocal EnableDelayedExpansion
for /f %%a in ('copy /Z "%~f0" nul') do set "CR=%%a"
set num=0
set "st[0]=| "
set "st[1]=/ "
set "st[2]=--"
set "st[3]=\ "

rem Do here anything you want before the mysql command...

echo Doing something for 10 seconds...
rem Create the flag file
echo X > DoingSomething
rem Re-start this Batch file with the special parameter
start "" /B "%~F0" :DoSomething
rem Simultaneously execute the waiting animation
call :LOOP

rem Do here anything you want after the mysql command...

rem ... and terminate
goto :EOF


:LOOP
set /a num=(num+1) %% 4
<nul set /P "=Wait !st[%num%]!!CR!"
TIMEOUT /T 1 >NUL
IF EXIST DoingSomething GOTO :LOOP
echo Ending loop
goto :EOF


:DoSomeThing
rem Place here the mysql command
TIMEOUT /T 10 >NUL
rem Delete the flag file
del DoingSomething
rem And terminate the second thread
goto :EOF