Невозможно напечатать (повторить) определенный элемент массива в пакетном сценарии - PullRequest
0 голосов
/ 15 октября 2019

Я определяю списки в пакетном скрипте и затем хочу напечатать определенный элемент в каждом из них, но получаю вывод 'ECHO is off' (если он пуст).

Я пыталсяцикл по спискам с циклом FOR, и он работал нормально.

Это код, который я пытаюсь запустить

@echo off

rem --------start of Define list--------
set clist= 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
set ilist= 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 
set testl= 1 2 3 4
rem --------end of Define list--------

echo %clist[1]%
echo %ilist[1]%
echo %testl[1]%

Ожидаемый результат:

B
Y
2

Фактический объем производства:

ECHO is off
ECHO is off
ECHO is off

Ответы [ 3 ]

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

Вот пример использования метода, описанного здесь , для создания вашего массива как переменных:

@Echo Off & SetLocal EnableDelayedExpansion

Rem ------- Start of define list -------
Set "clist=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"
Set "ilist=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" 
Set "testl=1 2 3 4"
Rem -------- End of define list --------

Rem ------- Start of array lists -------
Set "i=0"
Set "clist[!i!]=%clist: =" & Set /A i+=1 & Set "clist[!i!]=%"
Set "i=0"
Set "ilist[!i!]=%ilist: =" & Set /A i+=1 & Set "ilist[!i!]=%"
Set "i=0"
Set "testl[!i!]=%testl: ="& Set /A i+=1 & Set "testl[!i!]=%"
Set "i="
Rem -------- End of array lists --------

Rem ----- Start your commands here -----
Echo %clist[1]%
Echo %ilist[1]%
Echo %testl[1]%
Pause
Rem ------ End your commands here ------

EndLocal & GoTo :EOF
0 голосов
/ 15 октября 2019

Если значения вашего элемента «array» всегда имеют длину 1 символ, то единственная переменная с операциями подстроки - это все, что нужно.

@echo off

rem --------start of Define list--------
set "clist=ABCDEFGHIJKLMNOPQRSTUVWXYZ
set "ilist=XYZABCDEFGHIJKLMNOPQRSTUVW 
set "testl=1234
rem --------end of Define list--------

echo %clist:~1,1%
echo %ilist:~1,1%
echo %testl:~1,1%

rem Show all values in loop
setlocal enableDelayedExpansion
for /l %%N in (0 1 25) do (
  echo clist[%%N] = !clist:~%%N,1!
  echo ilist[%%N] = !ilist:~%%N,1!
  echo testl[%%N] = !testl:~%%N,1!
)
0 голосов
/ 15 октября 2019

Если бы вы действительно собирались имитировать массив, то это было бы что-то похожее на это.

@echo off
setlocal EnableDelayedExpansion

set "clist=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"
set /a cnt=0
for %%a in (%clist%) do (
   set "clist[!cnt!]=%%a"
   set /a cnt+=1
)
for /l %%i in (0,1,!cnt!) do echo( clist[%%i]=!clist[%%i]!

Вы также можете отдельно выводить переменные.

echo %clist[1]%`
...