Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ запуск программ из командного файла

Автор: *оля* 20.03.2012 21:50

Здравствуйте.
Нужно в зависимости от выбранного пункта меню запустить то или иное приложение. Однако при запуске сразу открывается первое приложение и больше ничего не делается. в чем ошибка?

Код
echo off
goto choice
:choice
cls
echo 1)  WINMINE
echo 2) SOLITER
echo 3)  PAINT
echo 4) QUIT PROGRAMM
choice /c:1234 CLICK ON ONE KEY FROM LIST
if errorlevel 4 goto question
if errorlevel 3 goto paint
if errorlevel 2 goto sol
if errorlevel 1 goto winmine
:winmine
c:\windows\system32\winmine.exe
goto choice
:sol
C:\WINDOWS\system32\sol.exe
goto choice
:paint
C:\WINDOWS\system32\mspaint.exe
goto choice
:question
cls
echo  QUIT??
choice /c:yn
if errorlevel 2 goto choice
if errorlevel 1 goto quit
:quit
exit


заранее спасибо.

Автор: IUnknown 20.03.2012 22:08

Ты под какой Windows это тестируешь? CHOICE уже под XP отсутствует. Вместо него используется set /p

Автор: Lapp 21.03.2012 9:44

Володь, ты что-то путаешь.. SET действительно можно использовать для этих целей (начиная с Win2K), но CHOICE таки никто не отменял.

Оля, а ты вообще смотрела синтаксис команды choice? Извини, я немного удивлен, что у тебя такие ляпы - ты уж вроде съела пару шавок в программинге.. ))
Во-первых, отсутствует ключ мессаджа, во-вторых мессадж должен быть в кавычках, если он содержит пробелы:

choice /c:1234 /m "CLICK ON ONE KEY FROM LIST"

Далее, если ты не хочешь остаться в вызываемой проге до завершения ее работы, то конечно же надо использовать start. Короче, вот как-то так:

echo off
rem goto choice
:choice
cls
echo 1) WINMINE
echo 2) SOLITER
echo 3) PAINT
echo 4) QUIT PROGRAMM
choice /c:1234 /m "CLICK ON ONE KEY FROM LIST"
if errorlevel 4 goto question
if errorlevel 3 goto paint
if errorlevel 2 goto sol
if errorlevel 1 goto winmine
:winmine
start winmine.exe
goto choice
:sol
start sol.exe
goto choice
:paint
start mspaint.exe
goto choice
:question
cls
echo QUIT??
choice /c:yn
if errorlevel 2 goto choice
if errorlevel 1 goto quit
:quit
exit

Я тут убрал пути к прогам - нельзя же так наивно, c:\windows - используй переменные окружения, %WinDir% и т.д., или уж полагайся на PATH (как сделал я).
Еще один совет - не надо называть метки именами команд, себя же запутываешь. Сделай program_choice, run_winmine - например..

P.S.
Да, и добавь еще пару проверок на выход - они, что - сдурели? выходить из такой замечательной программы?!?!?!?!?! А в строке "echo QUIT??" не хватает одиннадцати вопросительных знаков и тринадцати восклицательных (английский давно повторяла?)). Этих трататаханных юзеров надо постоянно по башке лупить, они это страсть как любють и жить без того не можуть..


P.P.S.
В качестве отладчика - включай эхо на отдельных участках (а для начала ВООБЩЕ не выключай его нигде).

Автор: IUnknown 21.03.2012 14:46

Цитата(Lapp @ 21.03.2012 4:44) *
Володь, ты что-то путаешь.. SET действительно можно использовать для этих целей (начиная с Win2K), но CHOICE таки никто не отменял.
У меня на машине с XP вызов CHOICE не отработал, в списке http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ntcmds.mspx#ETAA его тоже нет. Отработало вот так:

Код
echo off
:choice
cls
echo 1)  WINMINE
echo 2) SOLITER
echo 3)  PAINT
echo 4) QUIT PROGRAMM

set /p a="CLICK ON ONE KEY FROM LIST "
if "%a%" == "4" goto question
if "%a%" == "3" goto paint
if "%a%" == "2" goto sol
if "%a%" == "1" goto winmine
:winmine
start /wait winmine.exe
goto choice
:sol
start /wait sol.exe
goto choice
:paint
start /wait mspaint.exe
goto choice
:question
cls
set /p a="Quit?"
if "%a%" == "n" goto choice
:quit

(выходить EXIT-ом по метке quit не стал для целей отладки, start /wait - чтобы дожидаться завершения одной программы, и только потом запускать другую, а не мешать все в одну кучу)