Как бы я установить каждую строку текстового документа для разделения переменных с помощью пакета? - PullRequest
1 голос
/ 05 декабря 2011

Как бы установить каждую строку текстового документа для разделения переменных с помощью пакета? Я знаю, как установить переменную в первой строке текстового документа, используя:

Set /p Variable=<Test.txt

... но я не знаю, как читать другие строки файла. Допустим, например, у меня был текстовый документ с 3 строками, в первой строке было написано «Яблоки», во второй - «Бананы», а в третьей - «Груши», и, допустим, документ назывался Fruit.txt. Как бы установить переменную 'Line_1' для первой строки документа, 'Line_2' для второй строки и 'Line_3' для последней строки ?. Для простоты скажем, что пакетный файл и Fruit.txt находятся в одной папке. Я не хочу делать это в VBScript, поэтому, пожалуйста, публикуйте только пакетный код. Я бы подумал, что это будет что-то вроде:

@Echo off
Set /p Line_1=<Fruit.txt:1
Set /p Line_2=<Fruit.txt:2
Set /p Line_3=<Fruit.txt:3
Echo Fruit 1 is %Line_1%, Fruit 2 is %Line_2% and Fruit 3 is %Line_3%
Pause
Exit

... но совершенно ясно, что это не так. Любая помощь?

Ответы [ 2 ]

4 голосов
/ 05 декабря 2011

РЕДАКТИРОВАТЬ: Тогда это для файлов произвольной длины. 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 на единицу для каждой прочитанной строки.

1 голос
/ 05 декабря 2011

Чтобы прочитать несколько строк с set/p, вам нужны скобки вокруг блока set/p.

@Echo off
(
  Set /p Line_1=
  Set /p Line_2=
  Set /p Line_3=
) <Fruit.txt
Echo Fruit 1 is %Line_1%, Fruit 2 is %Line_2% and Fruit 3 is %Line_3%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...