Пакетные проблемы LEQ и GEQ - PullRequest
0 голосов
/ 29 февраля 2020

Так что я делаю пакетный проект, без идей, но я просто делаю это для развлечения, я пытаюсь сделать так, чтобы, если вам не исполнилось 16 лет, он сказал, что ушел, если нет, он сказал, что вы можете продолжить, однако Если я наберу меньше 16, он работает нормально, если я делаю старше или равен 16, он возвращается к обоим сообщениям ....

echo Core 0.0.1
echo By Supergrupgr
echo SpukkitDev 2020
echo Hit a key to continue
pause>nul
echo What is your age
set /p age=
goto determine
:determine
if %age% GEQ 16 goto oldenough
if %age% LEQ 15 goto min
:oldenough
echo You are old enough... What will you now do.
:min
echo You are not old enough... Leave.
pause

Ответы [ 3 ]

0 голосов
/ 29 февраля 2020

Вот пример макета, чтобы помочь вам:

@Echo Off
Echo Core 0.0.1
Echo By Supergrupgr
Echo SpukkitDev 2020
"%__AppDir__%timeout.exe" /T 5
Set "age=0"
Set /P "age=What is your age? >"
If %age% Lss 16 (
    Echo=
    Echo You are not old enough... Leave.
    Echo=
    "%__AppDir__%timeout.exe" /T 3 /NoBreak 1> NUL
    Exit /B 1
)
Echo You are old enough... What will you now do?
"%__AppDir__%timeout.exe" /T 3 1> NUL

Я включил последнюю строку, просто чтобы предотвратить быстрое закрытие окна, если не запускался из командной строки .

Чтобы узнать больше о каждой команде, откройте окно командной строки и введите каждое из следующих значений, при необходимости : Echo /?, "%__AppDir__%timeout.exe" /?, Set /?, If /? и Exit /?.

Примечания

  1. Вы заметите = сразу после Echo на двух линиях. Это фактически случайный символ, включенный для предотвращения отображения текущего статуса Echo (on или off). В результате вы получите пустые строки для визуального отображения.
  2. Для использования встроенной утилиты Timeout вам потребуется минимальное требование Windows.
0 голосов
/ 29 февраля 2020

Сначала мы напишем алгоритм:

Get user's age.
If age 16 or older, go do big kid stuff and exit,
else go do little kid stuff and exit.

Пишем, что в коде выглядит примерно так:

@setlocal EnableExtensions

@call :SetAge
@if %_age% GEQ 16 (@call :BigKidStuff) else (@call :LittleKidStuff)
@exit /b

:BigKidStuff
@echo You are old enough... What will you do now?
@exit /b 0

:InstructUser
@echo How old are you?  Please enter a number between 0 and 199.
@exit /b 0

:LittleKidStuff
@echo You are not old enough... Leave.
@exit /b 1

:SetAge
:_tryAgain
@call :InstructUser
@set /p _age=
@rem Check for numeric input and age limitations:
@set _inputVerified=0
@for /L %%N in (0,1,199) do @(@if "%%N" EQU "%_age%" @set _inputVerified=1)
@if not %_inputVerified% EQU 1 (@goto :_tryAgain)
@rem If we get this far, we have valid input between in the 0..199 range.
@exit /b 0

ПРИМЕЧАНИЕ: я не проводил много испытаний по этому вопросу, но я думаю, что охватывает все пути кода по крайней мере один раз. Попробуйте.

См. help setlocal, help for, help call, help goto, help if и help exit, чтобы узнать больше о приведенном выше коде.

Stylisti c примечания:

  • Я использую символы @ повсюду, а не @echo off, потому что он более совместим с другими сценариями и облегчает целевую отладку.
  • Я использую другой стиль имен меток для goto целей, чем call целей.
  • Я избегаю использования многострочных кодовых блоков (более одной строки между паренами), таких как чума .
0 голосов
/ 29 февраля 2020

Пакетные файлы просто переходят к метке, указанной вами в goto

. Затем она продолжает выполняться оттуда. Следующая метка не пропускается.

Два решения:

  1. Добавить больше условий и больше goto операторов
  2. поместить подпрограммы в отдельные пакетные файлы и используйте call чтобы запустить их
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...