пакетный скрипт - читать построчно - PullRequest
33 голосов
/ 24 декабря 2010

У меня есть файл журнала, который мне нужно прочитать, построчно и передать строку в следующий цикл.

Во-первых, я grep-файл журнала для «основного» слова (например, «ошибка») в отдельном файле - чтобы он был маленьким. Теперь мне нужно взять отдельный файл и прочитать его построчно - каждая строка должна идти в другой цикл (в этом цикле я извлекаю логи и делю их на блоки), но я застрял здесь.

Бревно выглядит как

xx.xx.xx.xx - - "http://www.blub.com/something/id=?searchword-yes-no" 200 - "something_else"

с циклом for / f Я просто получаю IP вместо полной строки.

Как я могу передать / записать / буферизовать всю строку? (не имеет значения, что написано в строке)

Ответы [ 3 ]

55 голосов
/ 24 декабря 2010

Попробуйте это:

@echo off
for /f "tokens=*" %%a in (input.txt) do (
  echo line=%%a
)
pause

из-за tokens=* все захвачено в %a

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

@echo off
for /f "tokens=*" %%a in (input.txt) do call :processline %%a

pause
goto :eof

:processline
echo line=%*

goto :eof

:eof

Из-за пробелов вы не можете использовать %1, потому что он будет содержать только часть до первого пробела. И поскольку строка содержит кавычки, вы также не можете использовать :processline "%%a" в сочетании с %~1. Так что вам нужно использовать %*, который получает %1 %2 %3 ..., поэтому вся строка.

6 голосов
/ 25 декабря 2010

У решения "call" есть некоторые проблемы.

Он терпит неудачу со многими различными содержимыми, так как параметры CALL анализируются парсером дважды.
Эти строки будут генерировать более или менеестранные проблемы

one
two%222
three & 333
four=444
five"555"555"
six"&666
seven!777^!
the next line is empty

the end

Поэтому не следует использовать значение %%a при вызове, лучше переместить его в переменную и затем вызвать функцию только с именем переменной.

@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t.txt"`) do (
    set "myVar=%%a"
    call :processLine myVar
)
goto :eof

:processLine
SETLOCAL EnableDelayedExpansion
set "line=!%1!"
set "line=!line:*:=!"
echo(!line!
ENDLOCAL
goto :eof
2 голосов
/ 19 августа 2014

Это работало для меня в прошлом и даже расширит переменные окружения в файле, если сможет.

for /F "delims=" %%a in (LogName.txt) do (
     echo %%a>>MyDestination.txt
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...