РЕДАКТИРОВАТЬ: Тогда это для файлов произвольной длины. jeb имеет ответ, который решает вашу конкретную проблему для известного числа строк.Я оставлю это здесь, хотя, так как я ненавижу удалять посты, я уделяю некоторое время для объяснения: -)
Ну, вам, очевидно, нужен какой-то счетчик.Давайте начнем с 1:
set Counter=1
Затем вам нужно пройтись по файлу:
for /f %%x in (somefile) do ...
Затем сохранить строку в пронумерованной переменной (это то, что мы имеемсчетчик):
set "Line_!Counter!=%%x"
аааа и увеличить счетчик:
set /a Counter+=1
И все.Добавьте еще несколько необходимых вещей, знаете ли, скучных вещей, которые всегда нужны в таких случаях (странные выражения до и после, разделители блоков и т. Д.), И все готово:
@echo off
setlocal enabledelayedexpansion
set Counter=1
for /f %%x in (somefile) do (
set "Line_!Counter!=%%x"
set /a Counter+=1
)
set /a NumLines=Counter - 1
Echo Fruit 1 is %Line_1%, Fruit 2 is %Line_2% and Fruit 3 is %Line_3%
rem or, for arbitrary file lengths:
for /l %%x in (1,1,%NumLines%) do echo Fruit %%x is !Line_%%x!
Некоторое объяснение:
set /p Var=<file
установит переменную в первую строку файла, как вы заметили.Это работает, потому что set /p
запрашивает ввод, а < file
перенаправляет файл на стандартный ввод команды.Таким образом, set /p
будет интерпретировать содержимое файла как введенный ввод до тех пор, пока пользователь не нажмет Return (то есть файл содержит разрыв строки).Вот почему вы получаете первую строку.Система выдаст весь файл в set /p
, но поскольку команда читает только первую строку, а затем выполняется, они просто отбрасываются.
Синтаксис, который вы предлагаете, на самом деле предназначен для доступа к Альтернативным даннымПотоки файлов в NTFS, что совсем другое.
<short-detour>
Однако, jeb может читать несколько строк.Это работает, потому что блок (разделенный круглыми скобками) представляет собой одну команду (см. Ниже), в которую вы можете перенаправить содержимое файла.За исключением того, что команда состоит из нескольких операторов, каждый из которых будет читать одну строку и сохранять ее.</short-detour>
Что приводит нас к for /f
, который перебирает содержимое файла (или вывод команды) построчно и выполняет команду или блок команд длякаждая строка.Теперь мы можем прочитать весь файл в столько переменных, сколько есть строк.Нам даже не нужно знать сколько заранее.
Возможно, вы заметили там Line_!Counter!
, который использует Counter
немного по-другому, как вы использовалиЯ думаю, использовать переменные среды.Это называется отложенное расширение и необходимо в некоторых случаях из-за того, как cmd
анализирует и выполняет пакетные файлы.Переменные среды в команде расширяются до их значений при разборе этой команды.В этом случае весь for /f
, включая блок, содержащий два оператора, является одной командой для cmd
.Таким образом, если бы мы использовали %Counter%
, то оно было бы заменено значением Counter
, имевшим до цикла (1
), и никогда не изменилось бы во время работы цикла (так как он анализируется один раз и выполняется несколько раз)Отложенное расширение (сигнализируется с помощью !
вместо %
для доступа к переменным, что изменяет и расширяет переменные среды непосредственно перед выполнением команды.
Это почти всегда необходимо, если вы изменяете переменную в циклеи использовать его снова в том же цикле. Кроме того, для этого необходимо сначала включить отложенное расширение, которое выполняется с помощью команды setlocal
и соответствующего аргумента:
setlocal enabledelayedexpansion
set /a
выполнит арифметику. Мы используем ее здесь для увеличения Counter
на единицу для каждой прочитанной строки.