Выполнение команд с помощью al oop с помощью cmd - PullRequest
0 голосов
/ 09 мая 2020

Я хочу создать командный файл, который одновременно выполняет команду и выполняет все oop одновременно. Когда l oop появится снова, команда больше не будет выполняться. Вот код для l oop:

@echo off
setlocal EnableDelayedExpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"

FOR /L %%n in (1,1,10) DO (
    call :spinner
    ping localhost -n 2 > nul
)
exit /b

:spinner
set /a "spinner=(spinner + 1) %% 4"
set "spinChars=\|/-"
<nul set /p ".=Rebuilding, please wait... !spinChars:~%spinner%,1!!CR!"
exit /b

Однако есть проблема: l oop будет выполняться и выполняется только тогда, когда команда выполнена. И для l oop нет тайм-аутов, поэтому в основном он будет выполнять l oop вечно, пока я не нажму Ctrl + C. Кто-нибудь может мне с этим помочь? И если можете, пожалуйста, сделайте приведенный выше код лучше. Заранее спасибо.

1 Ответ

0 голосов
/ 09 мая 2020

Установить переменную с истинным значением, когда команда выполняется в первом экземпляре, и Условное тестирование в этой переменной перед выполнением указанной команды

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...