Можно ли объявить список или массив в пакетном файле следующим образом:
set list = "A B C D"
А потом мне нужно записать их в файл с пробелами между:
A
B
C
D
Можно ли объявить список или массив в пакетном файле следующим образом:
set list = "A B C D"
А потом мне нужно записать их в файл с пробелами между:
A
B
C
D
Да, вы можете использовать оба способа. Если вы просто хотите разделить элементы и показать их в отдельных строках, список проще:
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(пакетный) script
ВНИМАНИЕ! Вы должны знать, что все символы, включенные в команду set
, вставляются в имя переменной (слева от знака равенства) или в значение переменной. Например, эта команда:
set list = "A B C D"
создайте переменную с именем list
(list-space) со значением "A B C D"
(пробел, цитата, A и т.д.). По этой причине не рекомендуется вставлять пробелы в команды set
. Если вам нужно заключить значение в кавычки, вы должны заключить как имя переменной, так и ее значение:
set "list=A B C D"
PS - НЕ используйте ECHO.
, чтобы оставить пустые строки! Альтернативой является ECHO/
. Для получения дополнительной информации об этом пункте см.: http://www.dostips.com/forum/viewtopic.php?f=3&t=774
@echo off
setlocal
set "list=a b c d"
(
for %%i in (%list%) do (
echo(%%i
echo(
)
)>file.txt
Вам не нужно - фактически, не может "объявлять" переменные в пакетном режиме. Присвоение значения переменной создает его, и назначение пустой строки удаляет ее. Любое имя переменной, у которой нет назначенного значения. HAS имеет значение пустой строки. Все переменные являются строками - БЕЗ исключения. Существуют операции ARE, которые, как представляется, выполняют (целочисленные) математические функции, но они работают путем преобразования взад и вперед от строк.
Пакет чувствителен к пробелам в именах переменных, поэтому ваше присваивание как отправленное будет назначать строку "A B C D"
- включая кавычки - переменной "list "
- НЕ включая кавычки, но включая пробел. Синтаксис set "var=string"
используется для назначения значения string
var
, тогда как set var=string
будет делать то же самое. Почти. В первом случае любые случайные пробелы после закрывающей цитаты исключаются из назначенного значения, во втором - ВКЛЮЧЕНЫ. Пробелы немного трудно увидеть при печати.
ECHO
перекликается с строками. В общем, за ним следует пробел - один из разделителей по умолчанию, используемых пакетом (остальные - TAB, COMMA, SEMICOLON - любой из них делает это тоже. НО TABS часто преобразуются в пространственный скрест с помощью текстовых редакторов и на протяжении многих лет другие выросли.) Другие персонажи, следующие за O
в ECHO
, как было установлено, выполняют именно то, что должно делать документальное пространство. DOT распространен. Открытая скобка (
, вероятно, наиболее полезна, так как команда
ECHO.%emptyvalue%
создаст отчет о состоянии ECHO
(ECHO is on/off
), тогда как
ECHO(%emptyvalue%
создаст пустую строку.
Проблема с ECHO(
заключается в том, что результат "выглядит" неуравновешенным.
Иногда элемент массива может быть очень длинным, в то время вы можете создать массив таким образом:
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/
)
В пакетных файлах нет типа "массив", который иногда является как положительным, так и отрицательным, но есть обходные пути.
Вот ссылка, которая предлагает несколько советов по созданию системы, подобной массиву в пакете: http://hypftier.de/en/batch-tricks-arrays.
echo variable >> filepath
работает для вывода содержимого переменной в файл,echo.
(точка не опечатка) работает для повторения символа новой строки.Я думаю, что эти два вместе должны работать, чтобы выполнить то, что вам нужно.
@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%]!