2015-02-20 1 views
0

Я хочу запустить цикл и иметь его так, чтобы при нажатии определенного ключа цикл заканчивался, что-то вроде ниже, хотя это не работает. Также цикл должен продолжать работать и не останавливаться, ожидая ввода от пользователя.Пакет, который выполняет команду при нажатии кнопки при запуске цикла

@echo off 
:start 
echo 1 
IF "a"=="" GOTO end 
goto :start 
:end 
pause 

ответ

1

Это работает автоматически во всех командных сценариях, если определенный ключ Ctrl+C.

В противном случае вам нужна проверка на каждой итерации вашего цикла (как и у вас) и другой процесс для контроля клавиатуры.

:: Allocate a probably-unique filename 
set SENTINELFILE=%temp%\sentinel-%random%-%time:~6,5%.lck 

:: Should probably do something less destructive if the file already exists 
:: like loop and find another name. But this is a prototype. 
copy /y NUL %SENTINELFILE% 

:: Opens a new cmd window which prompts the user to press X 
:: then deletes the sentinel and exits 
:: Could also run another batch file or exe that does something we can detect 
start "End Task" %comspec% /c choice /c x /M "Press X to end task" ^& del %SENTINELFILE% 

:topofloop 

:: TODO: Process some part of your work to be done 

:: Loop as long as the sentinel file exists 
if exist %SENTINELFILE% goto :topofloop 
+0

SENTINELFILE не удаляется, поэтому цикл продолжается. – Neb9

+0

Я пробовал сделать это: del «% SENTINELFILE%» В другом пакетном файле он навсегда удалил почти все с моего рабочего стола. Однако мне удалось восстановить файлы, используя другую программу. – Neb9

+0

Typo в скрипте. Удалите/y из команды del. Здесь работает. Не уверен, что случилось с вашим рабочим столом, но ваша переменная SENTINELFILE, вероятно, указала на каталог вместо имени файла. Вероятно, вам следует протестировать временную папку, а не папку рабочего стола. :) –

0

Что вы имеете в виду, это многопоточность (один поток принимает вход и один запускает цикл). Есть несколько сложных способов сделать это. Однако, чтобы сэкономить время и усилия, дешевый трюк вы можете сделать, это держать петлю, каждую итерацию для второго и ждать ввода с помощью choice команды:

@echo off 
:start 
echo 1 
choice /c "qa" /d q /t 1 /n /m "Press a to Stop Loop: " 
if %errorlevel%==2 goto end 
cls 
goto :start 
:end 
pause 

который остановит его один раз в секунду, чтобы проверить ввод как a