Создать список или массивы в 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%]!