Создать список или массивы в Windows Batch

Могу ли я объявить список или массив в командном файле следующим образом:

set list = "A B C D"

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

A

B

C 

D

7 ответов

Да, вы можете использовать оба способа. Если вы просто хотите разделить элементы и показать их в отдельных строках, список проще:

set list=A B C D

Список значений, разделенных пробелом, может быть легко обработан for команда:

(for %%a in (%list%) do (
   echo %%a
   echo/
)) > theFile.txt

Вы также можете создать массив следующим образом:

setlocal EnableDelayedExpansion
set n=0
for %%a in (A B C D) do (
   set vector[!n!]=%%a
   set /A n+=1
)

и показать элементы массива следующим образом:

(for /L %%i in (0,1,3) do (
   echo !vector[%%i]!
   echo/
)) > theFile.txt

Дополнительные сведения об управлении массивами в пакетных файлах см. В разделе: массивы, связанные списки и другие структуры данных в сценарии cmd.exe (пакетная обработка).

ВНИМАНИЕ! Вы должны знать, что все персонажи включены в set Команда вставляется в имя переменной (слева от знака равенства) или в значение переменной. Например, эта команда:

set list = "A B C D"

создать переменную с именем list (list-space) со значением "A B C D" (пробел, цитата, А и т. д.). По этой причине рекомендуется не вставлять пробелы в set команды. Если вам нужно заключить значение в кавычки, вы должны заключить как имя переменной, так и ее значение:

set "list=A B C D"

PS - вы не должны использовать ECHO. Для того, чтобы оставить пустые строки! Альтернатива ECHO/, Дополнительную информацию об этом можно найти по адресу: http://www.dostips.com/forum/viewtopic.php?f=3&t=774

Иногда элемент массива может быть очень длинным, в это время вы можете создать массив следующим образом:

set list=a
set list=%list%;b 
set list=%list%;c 
set list=%list%;d

Тогда покажи это:

@echo off
for %%a in (%list%) do ( 
 echo %%a
 echo/
)
@echo off
setlocal
set "list=a b c d"
(
 for %%i in (%list%) do (
  echo(%%i
  echo(
 )
)>file.txt

Вам не нужно - на самом деле, не может "объявлять" переменные в пакете. Присвоение значения переменной создает его, а присвоение пустой строки удаляет его. Любое имя переменной, которому не присвоено значение, имеет значение пустой строки. ВСЕ переменные являются строками - БЕЗ исключения. Существуют операции ARE, которые, по-видимому, выполняют (целочисленные) математические функции, но они работают путем преобразования туда и обратно из строк.

Пакет чувствителен к пробелам в именах переменных, поэтому ваше присвоение как опубликованное будет присваивать строку "A B C D" - включая кавычки, к переменной "list " - Не включая кавычки, но включая пробел. Синтаксис set "var=string" используется для присвоения значения string в var в то время как set var=string будет делать то же самое. Почти. В первом случае любые пробелы в конце после закрывающей кавычки ИСКЛЮЧЕНЫ из назначенного значения, во втором они ВКЛЮЧЕНЫ. Пробелы немного трудно увидеть при печати.

ECHO отголоски строк. Классически за ним следует пробел - один из разделителей по умолчанию, который используется пакетным способом (остальные - TAB, COMMA, SEMICOLON) - любой из них делает то же самое, НО TABS часто преобразуются в последовательность пробелов текстовыми редакторами и за эти годы у других появились свои причуды.) Другие персонажи, следующие за O в ECHO было обнаружено, что он делает именно то, что должен делать задокументированный ПРОБЕЛ. ТОЧКА распространена. Открывающая скобка ( вероятно, самая полезная, так как команда

ECHO.%emptyvalue%

подготовит отчет о ECHO государство (ECHO is on/off) в то время как

ECHO(%emptyvalue%

выдаст пустую строку.

Проблема с ECHO( в том, что результат "выглядит" неуравновешенным.

В пакетных файлах нет типа "массив", который иногда является как положительным, так и отрицательным, но есть обходные пути. Вот ссылка, которая предлагает несколько советов по созданию системы, подобной массиву в пакете: http://hypftier.de/en/batch-tricks-arrays. Что касается вывода в файл, "echo variable >> filepath" работает для вывода содержимого переменной в файл, а "echo". (точка не опечатка) работает или повторяет символ новой строки. Я думаю, что эти два вместе должны работать, чтобы выполнить то, что вам нужно.

Мне так нравится:

      set list=a;^
b;^
c;^ 
d;


for %%a in (%list%) do ( 
 echo %%a
 echo/
)

Настройка среды

      @echo off
setlocal enabledelayedexpansion

Создать список

      set items[0]=First
set items[1]=Second
set items[2]=Third
set items[3]=Fourth
set items[4]=Fifth

Выберите из списка

      %items[1]%

Показать элемент из списка

      echo %items[1]%

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

      set /p choice="Enter choice:
echo !items[%choice%]!

Показать список. Магические числа в скобках: 0начальный индекс массива. 1Шаг. 4последний пункт. %%iэто ваш индекс.

      for /L %%i in (0,1,4) do (
    echo !items[%%i]!
)
@echo off

set array=

setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

set nl=^&echo(

set array=auto blue ^!nl!^
  bycicle green ^!nl!^
  buggy   red

echo convert the String in indexed arrays

set /a index=0

for /F "tokens=1,2,3*" %%a in ( 'echo(!array!' ) do (

 echo(vehicle[!index!]=%%a color[!index!]=%%b 
 set vehicle[!index!]=%%a
 set color[!index!]=%%b
 set /a index=!index!+1   

)

echo use the arrays

echo(%vehicle[1]% %color[1]%
echo oder

set index=1
echo(!vehicle[%index%]! !color[%index%]!
Другие вопросы по тегам