Пакетная команда выбора с выбором переменной - PullRequest
1 голос
/ 30 октября 2019

Я хотел бы знать, возможно ли выполнить команду choice / c с выбором переменной.

Пример того, что у меня в голове:

@echo off
set "list=Bob,Adam,Steve" 
set amount=3 

for /l %%i in (1; 1; %amount%) do call :sub %%i

goto chooseName
:sub
for /f "tokens=%1 delims=," %%a in ("%list%") do echo %%i. %%a
goto :eof

:chooseName
choice /c %amount% /m "What name do you want to choose"

if errorlevel 3 do ...
if errorlevel 2 do ...
if errorlevel 1 do ...

Созданиесписок работает нормально, и это дает мне возможность выбрать форму списка, но только говорит:

What name do you want to choose: [3]?

Так что мне нужно изменить эту часть кода:

choice /c 123 /m "What name do you want to choose"

, чтобывместо «123» потребуется переменная (в данном случае длина списка), так что если я добавлю имя в список, это позволит вам ввести 1, 2, 3 или 4, и если я возьму имяэто вернется к тому, чтобы дать вам 3 варианта.

Ответы [ 3 ]

1 голос
/ 31 октября 2019

Добавление немного к ответу Бена (в действительности это невозможно в комментариях) -

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

Еще один момент - вместо всех операторов if errorlevel можно вместо этого вызывать метку переменной.

@echo off
setlocal enabledelayedexpansion
set allchoices=123456789abcdefg
set amount=6

choice /c !allchoices:~0,%amount%! /m "What do you want to choose? "

goto :choice%errorlevel%
rem You'll get an error if there isn't a label that corresponds to :choice%errorlevel%

:choice1
echo You chose 1
pause
goto :eof

:choice10
echo You chose a
pause
goto :eof

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

1 голос
/ 31 октября 2019

Хотя это выглядит совсем по-другому, в основном используется та же техника, что и у Бена. Это просто (без подпрограмм) и использует только подмножество всех возможных символов. Я ставлю заглавные буквы в конце, потому что легче набрать a, чем A. Это уменьшает количество вариантов, но имхо нет смысла использовать символы, которые вы не можете легко использовать с помощью клавиатуры (и если у вас действительно должно быть более 60 вариантов, вам следует подумать о более удобном для пользователя подходе)

@echo off
setlocal enabledelayedexpansion  

set "list=Bob,Adam,Steve,Alex,Bart,Charles,Dough,Emil,Fritz,Gustav" 
set "allchoices=123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
set count=0
for %%A in (%list%) do (
  call echo %%allchoices:~!count!,1%%: %%A
  set /a count+=1
  set "list[!count!]=%%A"
)
set "choices=!allchoices:~0,%count%!"
choice /cs /c %choices% /m "What name do you want to choose"
echo that would be !list[%errorlevel%]!
goto :sub%errorlevel%
:sub0
echo Control-C is mean...
goto :eof
:sub1
echo Hello Bob
goto :eof
REM etc...
1 голос
/ 30 октября 2019

Да, это полностью выполнимо, вам просто нужно создать свой список.

Теперь, когда вы сказали, что понимаете, что выбор допускает только символы 0-9, AZ az и ASCII от 128 до 254, верно?

То есть вам нужно использовать список символов, чтобы создать выбор, и просто выбрать желаемое количество вариантов.

вот список используемых символовс выбором:

0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z Ç ü é â ä à å ç ê ë è ï î ì Ä Å É æ Æ ô ö ò û ù ÿ Ö Ü ¢ £ ¥ ₧ ƒ á í ó ú ñ Ñ ª º ¿ ⌐ ¬ ½ ¼ ¡ « » ░ ▒ ▓ │ ┤ ╡ ╢ ╖ ╕ ╣ ║ ╗ ╝ ╜ ╛ ┐ └ ┴ ┬ ├ ─ ┼ ╞ ╟ ╚ ╔ ╩ ╦ ╠ ═ ╬ ╧ ╨ ╤ ╥ ╙ ╘ ╒ ╓ ╫ ╪ ┘ ┌ █ ▄ ▌ ▐ ▀ α ß Γ π Σ σ µ τ Φ Θ Ω δ ∞ φ ε ∩ ≡ ± ≥ ≤ ⌠ ⌡ ÷ ≈ ° ∙ · √ ⁿ ² ■

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

Вот пример сценария, который выполнил вашу цель:

@(SETLOCAL EnableDelayedExpansion
  ECHO OFF
  set "_ChoiceList=Bob,Adam,Steve,Alex,Durand,Killian,Hello,There,Now,Is,Going,Past"
  REM Full Character List to populate Choices
  SET "_CharList=0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z Ç ü é â ä à å ç ê ë è ï î ì Ä Å É æ Æ ô ö ò û ù ÿ Ö Ü ¢ £ ¥ ₧ ƒ á í ó ú ñ Ñ ª º ¿ ⌐ ¬ ½ ¼ ¡ « » ░ ▒ ▓ │ ┤ ╡ ╢ ╖ ╕ ╣ ║ ╗ ╝ ╜ ╛ ┐ └ ┴ ┬ ├ ─ ┼ ╞ ╟ ╚ ╔ ╩ ╦ ╠ ═ ╬ ╧ ╨ ╤ ╥ ╙ ╘ ╒ ╓ ╫ ╪ ┘ ┌ █ ▄ ▌ ▐ ▀ α ß Γ π Σ σ µ τ Φ Θ Ω δ ∞ φ ε ∩ ≡ ± ≥ ≤ ⌠ ⌡ ÷ ≈ ° ∙ · √ ⁿ ² ■"
)

CALL :Main

( ENDLOCAL
  EXIT /B 0
)

:Main


  REM Now we can Do Our Choices btu lets do it in a Sub Function.
  CALL :MakeChoice _ChoiceResult
  ECHO.
  ECHO The Index Chosen Was: %_Chosen%
  ECHO The Result Matched is:  %_ChoiceResult%

GOTO :EOF

:MakeChoice
  cls
  color 1A
  SET %~1="
  SET "_Choices="
  SET "_Chosen="
  SET "_Amount="
  SET "_Choice#="
  echo.      Pick a Name:
  echo.========================

  REM Create Numbered Array of Choices and output Choices to the Screen
  FOR %%A IN (!_ChoiceList!) DO (
    SET /A "_Amount+=1"
    REM ECHO !_Amount!
    REM ECHO.SET "_Choice.!_Amount!.Value=%%A"
    SET "_Choice.!_Amount!.Value=%%A"  )
  ECHO.

  REM Create Choice List to Display only the choices needed.
  FOR %%A IN (%_CharList%) DO (
    SET /A "_Temp+=1"
    IF !_Temp! LEQ !_Amount! (
      SET "_Choices=!_Choices!%%A"
      CALL ECHO. %%A :    %%_Choice.!_Temp!.Value%%
    )
  )
  ECHO.

  CHOICE /CS /C !_Choices! /N /M "What name do you want to choose? "
  SET "_Chosen=%ERRORLEVEL%"

  REM Set Return Variable Value:
  SET "%~1=!_Choice.%_Chosen%.Value!"
GOTO :EOF

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

В функции выбора мы анализируем список вариантов (который также мог бы быть отправлен как указатель на список вариантов выбора), а затем подсчитываем их, повторяя номер выбора и.. упс, я понимаю, что я использовал метод Числовой выбор только из-за того, что SET /A - это изящный трюк, но он не работает для буквенных вариантов выбора, и при этом он не покажет начальный выбор 0 в начале. исправьте это.

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

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

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

Хорошо, вы должны правильно отобразить lishсейчас.

Хорошо, я понял, что мне нужно добавить это, чтобы быть вызовом, и у меня были некоторые ошибочно названные переменные, бла-бла-бла.

Long Story Short Я исправил как Above, и у меня было время проверитьубедитесь, что он работает как ожидалось.

Вот пример Результаты:

      Pick a Name:
========================

 0 :    Bob
 1 :    Adam
 2 :    Steve
 3 :    Alex
 4 :    Durand
 5 :    Killian
 6 :    Hello
 7 :    There
 8 :    Now
 9 :    Is
 A :    Going
 B :    Past

What name do you want to choose? 7

The Index Chosen Was: 8
The Result Matched is:  There
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...