0

I am trying to create a code that can process a variable based on a choice in a way like this:

set item1=ring
set item2=deadhead
set item3=bloodstainedmap
set item4=strangebox
cls
echo 1) %item1%
echo 2) %item2%
echo 3) %item3%
echo 4) %item4%
echo. 
echo Which Item do you wish to look at?
choice /c 1234 /n >nul
if %errorlevel%==1 goto itemin
if %errorlevel%==2 goto itemin
if %errorlevel%==3 goto itemin
if %errorlevel%==4 goto itemin

:itemin
cls
echo %item%errorlevel%%
::^^^^ this part here should read "ring" if i selected 1. It reads "errorlevel"

Obviously, I would like the Item to shown correctly when it loads the variable....

Any help?

A.S.C

dan1st
  • 12,568
  • 8
  • 34
  • 67
  • 2
    if (for some reason) you want to avoid [delayed expansion](https://stackoverflow.com/questions/30282784/variables-are-not-behaving-as-expected/30284028#30284028), you can also use `call echo %%item%errorlevel%%%` (you have to parse the command twice - first to expand `errorlevel` to its value, second to expand `itemX`) – Stephan Feb 17 '21 at 11:51

2 Answers2

1

Here is my suggestion for this task:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "item1=ring"
set "item2=deadhead"
set "item3=bloodstainedmap"
set "item4=strangebox"
cls
echo 1) %item1%
echo 2) %item2%
echo 3) %item3%
echo 4) %item4%
echo(
setlocal EnableDelayedExpansion
:UserChoice
%SystemRoot%\System32\choice.exe /C 1234 /N /M "Which item do you wish to look at?"
if not errorlevel 1 goto UserChoice
set "item=!item%ERRORLEVEL%!"
endlocal & set "item=%item%"
echo %item%
endlocal

The user prompt is repeated if the user presses Ctrl+C and answers the prompt by cmd.exe to exit processing of the batch file with N in which case the condition if not errorlevel 1 is true as the exit code of CHOICE is 0 in this special use case.

It would be of course also possible to enable delayed expansion already at top of the batch file. It must be just taken into account that all lines are parsed twice on doing that and ! is interpreted everywhere as start/end of a delayed expanded environment variable reference.

To understand the commands used and how they work, open a command prompt window, execute there the following commands, and read the displayed help pages for each command, entirely and carefully.

  • choice /?
  • cls /?
  • echo /?
  • endlocal /?
  • if /?
  • set /?
  • setlocal /?

See also:

Mofi
  • 46,139
  • 17
  • 80
  • 143
1

As a supplement to @Mofi's Answer:

The Choice command can be executed within a for /F loop allowing the choice option to be used directly as opposed to assessing errorlevels. The /N no prompt switch must be used, and the use of the /M custom prompt switch must be excluded.

The syntax for getting the actual key pressed as opposed to the errorlevel is:

@ECHO Off & Goto :main
====================================
:::  Script Break - Functions    :::
====================================

====================================
:main                            :::  
====================================
:::      Macro Definitions       :::
====================================
(Set \n=^^^

%= Newline var \n for macro definition - Do not modify. =%)
 If "!![" == "[" (
  Echo/DelayedExpansion Not permitted prior to Macro Definition.
  Exit /B 0
 )
========================================== ::: MENU macro prep and Definition :::
rem /* Key index list Allows 36 menu options. Component of Menu Macro /*
 Set "ChoList=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
rem /* Menu macro Usage: %Menu% "quoted" "list of" "options"
==========================================
==== Set Menu=For %%n in (1 2)Do if %%n==2 (%\n%
%= Output Dividing Line                 =%  Echo(!DIV!%\n%
%= Reset CH# index value for Opt[#]     =%  Set "CH#=0"%\n%
%= Undefine choice option key list      =%  Set "CHCS="%\n%
%= For Each in list;                    =%  For %%G in (!Options!)Do (%\n%
%= For Option Index value               =%   For %%i in (!CH#!)Do (%\n%
%= Build the Choice key list and Opt[#] =%    Set "CHCS=!CHCS!!ChoList:~%%i,1!"%\n%
%= array using the character at the     =%    Set "Opt[!ChoList:~%%i,1!]=%%~G"%\n%
%= current substring index. Display.    =%    Echo([!ChoList:~%%i,1!] %%~G%\n%
%= Increment Opt[#] Index var CH#       =%    Set /A "CH#+=1"%\n%
%= Close CH# loop                       =%   )%\n%
%= Close Options loop                   =%  )%\n%
%= Output Dividing Line                 =%  Echo(!DIV!%\n%
%= Select option by character index     =%  For /F "Delims=" %%o in ('Choice /N /C:!CHCS!')Do (%\n%
%= Assign return var OPTION with the    =%   Set "Option=!Opt[%%o]!"%\n%
%= value selected from Opt[CH#] array.  =%  )%\n%
%= Capture Macro input - Options List   =% )Else Set Options=
========================================== ::: End Menu Definition :::
rem /* Get console width for dividing line. */
 for /F "usebackq tokens=2* delims=: " %%W in (`mode con ^| findstr Columns`) do Set /A     "Console_Width=%%W"
rem /* Enable environment for macro expansion */
 Setlocal EnableDelayedExpansion
rem /* Build dividing line. */
 Set "DIV="&For /L %%i in (2 1 %Console_Width%)Do Set "DIV=!DIV!-"
====================================
:::         Script Body          :::
====================================
rem /* Optional - Define an Options list. */
 Set "Loot[1]= "ring" "dead head" "blood stained map" "strange box""
:menu
 CLS & Title %~n0
 %Menu% "exit" %Loot[1]%
 If "!Option!" == "exit" (Endlocal & Goto :Eof)Else Echo/You chose !Option!
rem /* Optional - remove selected option from list of options. Options should be Doublequoted with leading whitespace. */
 Set "Loot[1]=!Loot[1]: "%Option%"=!"
rem /* Do whatever you want with your option here. Execute it, use options as label names to call etc. */
 Pause
Goto :menu

T3RR0R
  • 2,747
  • 3
  • 10
  • 25
  • I like what I am seeing here, however how does it work? this is perfect for example, when using The said items, and the item is removed form inventory – Alexander Savidge-Conway Feb 18 '21 at 10:57
  • Batch macro's take advantage of the way cmd parses scripts to use variables as functions. To begin understanding how the interpreter works, See [this answer](https://stackoverflow.com/a/4095133/12343998). To understand the creation and use of Batch Macro's with arguments visit this [topic](https://stackoverflow.com/a/4095133/12343998). – T3RR0R Feb 18 '21 at 14:32
  • The particular steps this macro takes to achieve the task are described in the inline comments during the macro's definition. – T3RR0R Feb 18 '21 at 14:34