Как сделать меню определить переменную - PullRequest
0 голосов
/ 18 февраля 2019

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

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

Итак, вот пример, который я ищу, чтобы выяснить, как интегрировать Tot:

CHOICE /N /C:1234 /M "Option: "
IF ERRORLEVEL ==4 SET foo
IF ERRORLEVEL ==3 SET bar
IF ERRORLEVEL ==2 SET quak
IF ERRORLEVEL ==1 SET baz

[something something define %bark% from above]

rem overwrite file.png with new option
copy %src%\%bark%\file.png %des%\%quak%\file.png

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

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019

Ваша главная проблема здесь:

IF ERRORLEVEL ==N..

вместо этого должно быть:

if "%errorlevel%"=="N"

или

if errorlevel N

Если вы действительно хотите что-то установить,тогда я предпочел бы перейти к label и установить там все:

CHOICE /N /C:1234 /M "Option: "
if "%errorlevel%"=="4" goto :foo
if "%errorlevel%"=="3" goto :bar
if "%errorlevel%"=="2" goto :quak
if "%errorlevel%"=="1" goto :baz
:foo
set foo=bar
goto :eof
:bar
...

, но лично я предпочитаю делать вещи непосредственно в выражении if вместо того, чтобы goto иметь много меток.

CHOICE /N /C:1234 /M "Option: "
if "%errorlevel%"=="4" (
    set "foo=bar"
    goto :next
)
if "%errorlevel%"=="3" (
    set "foo=bar"
    goto :next
)
if "%errorlevel%"=="2" (
    set "foo=bar"
    goto :next
)
if "%errorlevel%"=="1" (
    set "foo=bar"
    goto :next
)
:next
echo %foo%

Наконец, для того, чтобы мы на 100% были уверены, переменная нуждается в значении, поэтому убедитесь, что вы используете set "foo=bar", иначе она просто отобразит переменную со значением, только если она существует.Вы можете проверить это, запустив cmd.exe и выполнив команду set "foo=bar", а затем set foo, чтобы увидеть результат.

0 голосов
/ 20 февраля 2019
@echo off
setlocal

choice /n /c:1234 /m "Press a key: "

for /f "tokens=%errorlevel% delims=|" %%A in (
    "foo|bar|quak|baz"
) do set "result=%%A"

echo %result%

Это будет set имя переменной result с выбранным значением числа errorlevel, возвращаемого choice:

  1. foo
  2. bar
  3. quak
  4. baz

Если нажата 3, то result устанавливается на значение quak.

Строка "foo|bar|quak|baz" отделяется | для создания 4 токенов значений, которые будут соответствовать последовательности 1234 параметров choice.

Если значения другие, вы можете изменить их при необходимости.


@echo off
setlocal

rem Test 1.
call :select "1|foo" "2|bar" "3|quak" "4|bar"
echo Result: %result%

rem Test 2.
call :select "a|apple" "b|orange" "c|banana"
echo Result: %result%

rem Test 3.
call :select
echo Result: %result%

rem Test 4 repeat.
:menu
call :select "1|car" "2|boat" "3|airplane"
echo Result: %result%

call :select "1|quit" "2|restart menu"
if /i "%result%" == "quit" goto :endmenu

goto :menu
:endmenu

exit /b


:select
setlocal
set args=%*
set "choices="
set "values="

rem Set default choices and values if needed.
if "%~1" == "" set args="y|y" "n|n"

rem Display menu with choices and values.
echo(

for %%A in (%args%) do (
    for /f "tokens=1* delims=|" %%B in ("%%~A") do (
        echo  %%B  %%C

        if defined choices (
            call set "choices=%%choices%%|%%B"
        ) else set "choices=%%B"

        if defined values (
            call set "values=%%values%%|%%C"
        ) else set "values=%%C"
    )
)

echo(

rem Prompt to press a key.
choice /n /c:%choices:|=% /m "Press a key: "

rem Get the value from the errorlevel.
for /f "tokens=%errorlevel% delims=|" %%A in ("%values%") do set "result=%%A"

rem Set nonlocal result.
endlocal & set "result=%result%"
exit /b

При этом используется метка с именем :select, которая выполняет следующие действия:

  • echo пункты меню и значения.
  • Запрос с использованием choice.
  • Устанавливает имя переменной result для выбранного значения.

аргументы, передаваемые в вызываемую метку :select, заключаются в двойные кавычки.Если вы назначите a в качестве клавиши выбора и apple в качестве значения результата, то вы будете использовать аргумент "a|apple".Разделитель | разделяет ключ и значение.

Вам не нужно менять код в метке :select, если вы не хотите его улучшить.

Вы упомянули " то же самое, несколько раз, без вздутия", так что Test 4 repeat возможно делает то, что вы хотите.Обратите внимание, что код между метками :menu и :endmenu намного меньше, чем если бы вам пришлось повторять отображение меню, команды выбора и обработку errorlevel, чтобы установить значение для имени переменной.

0 голосов
/ 18 февраля 2019

Вы можете сделать это двумя различными способами: первый - полностью удалить == там, где он представлен, поскольку это наиболее распространенный способ сделать это при использовании команды choice:

choice /N /C:1234 /M "Option: "
if errorlevel 4 set foo & goto :foo
if errorlevel 3 set bar & goto :bar
if errorlevel 2 set quak & goto :quak
if errorlevel 1 set baz & goto :baz

[something something define %bark% from above]

rem overwrite file.png with new option
copy %src%\%bark%\file.png %des%\%quak%\file.png

По убыванию просто потому, что if errorlevel x означает, что переменная errorlevel больше , чем или равна до x.

Второй, не очень распространенный способ, который используется для установки переменных, когда условие выполняется, заключается в следующем (обратите внимание, что здесь мы не обращаем внимания на порядок):

choice /N /C:1234 /M "Option: "
if %errorlevel% EQU 4 set foo & goto :foo
if %errorlevel% EQU 3 set bar & goto :bar
if %errorlevel% EQU 2 set quak & goto :quak
if %errorlevel% EQU 1 set baz & goto :baz

[something something define %bark% from above]

rem overwrite file.png with new option
copy %src%\%bark%\file.png %des%\%quak%\file.png

Здесь можно заменить EQU на ==, хотя это и не рекомендуется.

Обратите внимание, что если вы хотите установить переменных, если условиеЗначение true, используйте второй способ и установите переменные в формате set "var=value".

Например:

if %errorlevel% EQU 4 set "foo=1"
if %errorlevel% EQU 3 set "bar=2"
if %errorlevel% EQU 2 set "quak=3"
if %errorlevel% EQU 1 set "baz=4"

или как угодно.

Как не выполнять все4 if s, вы можете добавить GoTo здесь:

if %errorlevel% EQU 4 set "foo=1" & goto :foo
if %errorlevel% EQU 3 set "bar=2" & goto :bar
if %errorlevel% EQU 2 set "quak=3" & goto :quak
if %errorlevel% EQU 1 set "baz=4" & goto :baz

и заменить примеры подпрограмм фактическими именами.

Для получения дополнительной информации об используемых командах введитев cmd.exe:

  • if /?
  • choice /?
  • set /?
  • goto /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...