Установить переменную с истинным значением, когда команда выполняется в первом экземпляре, и Условное тестирование в этой переменной перед выполнением указанной команды
If not "!EXC!" == "" (Echo First Run) Else (Set "EXC=True")
Пример использует отложенное раскрытие, так как его можно использовать как в Для циклов и циклов меток.
Если вы хотите нарушить L oop, используйте условное тестирование для Goto: Label
Update
Теперь, когда вы предоставили более подробно в вашем вопросе, я считаю, что что-то вроде этого - то, что вы собираетесь.
@echo off
setlocal EnableDelayedExpansion
for /f %%a in ('copy /Z "%~dpf0" ^> nul') do set "CR=%%a"
set "spinChars=\|/-"
for /f "delims=#" %%a in ('"prompt #$H# &echo on &for %%b in (1) do rem"') do (
set "BS=%%a"
set "BS=!BS:~0,1!"
)
<nul set/p=Rebuilding, please wait...
FOR /L %%. in () DO (
REM insert conditional testing to break loop Here
set /a "spinner=(spinner + 1) %% 4"
For %%/ in (!Spinner!) Do <nul set /p=%BS%!spinChars:~%%/,1!
)
exit /b
:End_Loop
Echo You have Exited the process
Pause
Exit /B
Определение символа Backspace взято из этого сообщения
Какой бы процесс вы ни ожидали в загрузке l oop, вам понадобится какой-то метод, чтобы проверить его завершение. Поскольку вы не указали подробности, я предлагаю несколько вариантов:
- Существование файла
- Значение переменной
- результат тестирования по списку задач для проверьте, активна ли задача.
Если вы предоставите более подробную информацию о команде / процессе, которого вы ждете, можно будет предложить лучший ответ относительно условного тестирования.
Пример метода, который запускает подпрограмму как отдельный экземпляр в том же окне и использует сигнальные файлы для связи с основным L oop, когда выполнение команды завершено:
::: ** Batch Multithreading example by T3RRY ** :::
@Echo Off & CD "%~dp0" :::
:::::::::::::::::::::::::::::::::::::::::::::::::::
::: - Define any Variables to be used by both Environments
Set "spinChars=\|/-"
::: - Test if Thread Two is to be executed
If /I "%~1" == "Thread2" Goto :Thread2
::: - Localise Thread Ones Environment
Setlocal EnableDelayedExpansion
::: - Ensure previous Signal files removed in case program exited incorrectly
Del /Q /F "%TEMP%\CMDrun.log"
Del /Q /F "%TEMP%\CMDend.log"
CLS
::: - Define Backspace Character for Animation
For /F "delims=#" %%a in ('"prompt #$H# &echo on &for %%b in (1) do rem"') do (
Set "BS=%%a"
Set "BS=!BS:~0,1!"
)
<Nul Set/P=Processing, please wait.
:Loop
::: - Launch Thread Two in Same window if Not already Running
::: - Conditional tests on signal files redirect errors to Standard error to prevent erroneous output
::: - when testing occurs at the same time the file is being written to.
(IF Not Exist "%TEMP%\CMDrun.log" Start /B "" "%~F0" Thread2) 2>Nul
::: - Animation To indicate commands in thread one are running. A Loop is used in this example.
Set /A "spinner=(spinner + 1) %% 4"
For %%S in (!Spinner!) Do <Nul Set /P=%BS%!spinChars:~%%S,1!
::: - Exit Thread One once Thread Two has Completed
(IF Exist "%TEMP%\CMDend.log" Goto :End_Loop) 2>Nul
Goto :Loop
:End_Loop
::: - Clean up Signal Files
Echo.
Del /Q /F "%TEMP%\CMDrun.log"
Del /Q /F "%TEMP%\CMDend.log"
Echo Process Complete
Pause
::: - Demonstrate stability of multithreading through repetition
Start "" "%~F0"
Exit
:Thread2
::: Localise Thread Two's Environment
Setlocal EnableDelayedExpansion
>"%TEMP%\CMDrun.log" (Echo running)
::: - Title update to demonstrate commands executed in thread two are running
For /L %%# In (1,1,10000) Do (
Set /a "spinner=(spinner + 1) %% 4"
For %%S in (!Spinner!) Do TITLE !spinChars:~%%S,1! Output %%#
)
>"%TEMP%\CMDend.log" (Echo finished)
::: - Hard exit of Thread Two used to prevent script overflow.
EXIT