Let me share my way of doing this, and, I am not the author of that method.
This is the safe way to define/use arrays in cmd/bat.
I saw this on dostips.com /by @Aacini and after here /by @user6811411 (removed user), some time ago.
The original layout code is some like:
Set "var=%var:,="&Set /a i+=1&Set "var[!i!]=%
I prefer replace [] to one _
Also, change i+= to _i+=1+0, no need predefined command: set i=0
But it always works, and requires enabledelayedexpansion
variables
@echo off && setlocal enabledelayedexpansion && title <nul && title ...\%~nx0
rem :: define a variable for array_layout ::
set "_def_app.type=.html,.htm,.doc,.docx"
set "_def_app_.name=firefox,libreoffice,libreoffice"
rem :: replace/incrementing delimiter by a set /a_i+1%% ::
rem :: (miracle loop in set new variable _var_+i/index) ::
set "_def_app.type_0=%_def_app.type:,="&set/a _i+=1+0&set "_def_app.type_!_i!=%"
set "_def_app_.name_0=%_def_app_.name:,="&set/a _k+=1+0&set "_def_app_.name_!_k!=%"
rem :: use a for loop to echo/use the index array value i/I ::
echo/ && for /l %%i in (0 1 !_i!)do for /f tokens^=* %%I in ('echo/!_def_app.type_%%i!
')do echo/ %%I == ^^!_def_app.type_%%%i^^!
rem :: use a for loop to echo/use the indesx array value k/K ::
echo/ && for /l %%k in (0 1 !_k!)do for /f tokens^=* %%K in ('echo/!_def_app_.name_%%k!
')do echo/ %%K == ^^!_def_app_.name_%%%k^^!
rem :: get total index + 1 = positions
echo/ && for %%s in (i,k)do call set /a "_len_%%s=!_%%s!+1"
echo/ Index of [^^!_def_app.type^^!] is: 0-!_i!
echo/ Length of [^^!_def_app.type^^!] is: !_len_i!
echo/ && echo/ Index of [^^!_def_app_.name^^!] is: 0-!_k!
echo/ Length of [^^!_def_app_.name^^!] is: !_len_k!
%%_APPDIR__%timeout.exe -1 & endlocal & goto :EOF
.html == !_def_app.type_0!
.htm == !_def_app.type_1!
.doc == !_def_app.type_2!
.docx == !_def_app.type_3!
firefox == !_def_app_.name_0!
libreoffice == !_def_app_.name_1!
libreoffice == !_def_app_.name_2!
Index of [!_def_app.type!] is: 0-3
Length of [!_def_app.type!] is: 4
Index of [!_def_app_.name!] is: 0-2
Length of [!_def_app_.name!] is: 3
Press any key to continue...
- Same code without comments...
@echo off && setlocal enabledelayedexpansion && title <nul && title ...\%~nx0
set "_def_app.type=.html,.htm,.doc,.docx"
set "_def_app_.name=firefox,libreoffice,libreoffice"
set "_def_app.type_0=%_def_app.type:,="&set/a _i+=1+0&set "_def_app.type_!_i!=%"
set "_def_app_.name_0=%_def_app_.name:,="&set/a _k+=1+0&set "_def_app_.name_!_k!=%"
echo/ && for /l %%i in (0 1 !_i!)do for /f tokens^=* %%I in ('
echo/!_def_app.type_%%i!')do echo/ %%I == ^^!_def_app.type_%%%i^^!
echo/ && for /l %%k in (0 1 !_k!)do for /f tokens^=* %%K in ('
echo/!_def_app_.name_%%k!')do echo/ %%K == ^^!_def_app_.name_%%%k^^!
echo/ && for %%s in (i,k)do call set /a "_len_%%s=!_%%s!+1"
echo/ Index of [^^!_def_app.type^^!] is: 0-!_i!
echo/ Length of [^^!_def_app.type^^!] is: !_len_i!
echo/ && echo/ Index of [^^!_def_app_.name^^!] is: 0-!_k!
echo/ Length of [^^!_def_app_.name^^!] is: !_len_k!
timeout -1 & endlocal & goto :EOF