Variables in batch

193 views Asked by At

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

2

There are 2 answers

0
Mofi On BEST ANSWER

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:

3
T3RR0R On

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