我创建了以下批处理文件,它使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命令在后台工作,同时动画等待循环也可以工作吗?
答案 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