script em lote – leia linha por linha

Eu tenho um arquivo de log que eu preciso ler, linha por linha e canalizar a linha para um próximo loop.

Em primeiro lugar eu grep o arquivo de log para a palavra “principal” (como “erro”) em um arquivo separado – para mantê-lo pequeno. Agora eu preciso pegar o arquivo separado e lê-lo em linha por linha – cada linha precisa ir para outro loop (nesses loop eu grep os logs e dividi-lo em blocos), mas eu preso aqui.

O log parece

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

com um loop for / f, acabei de obter o IP em vez da linha completa.

Como posso canalizar / escrever / bufferizar toda a linha? (não importa o que está escrito por linha)

Tente isto:

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

por causa dos tokens=* tudo é capturado em %a

edit : para responder ao seu comentário, você teria que fazer assim:

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

Por causa dos espaços, você não pode usar %1 , porque isso só conteria a parte até o primeiro espaço. E como a linha contém aspas, você também não pode usar :processline "%%a" em combinação com %~1 . Então você precisa usar %* que obtém %1 %2 %3 ... , então toda a linha.

A solução “chamada” tem alguns problemas.

Ele falha com muitos conteúdos diferentes, pois os parâmetros de uma CALL são analisados ​​duas vezes pelo analisador.
Estas linhas produzirão problemas mais ou menos estranhos

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

Portanto, você não deve usar o valor de %%a com uma chamada, mova-a melhor para uma variável e chame uma function apenas com o nome da variável.

 @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 

Isso funcionou para mim no passado e até expandirá as variables ​​de ambiente no arquivo, se puder.

 for /F "delims=" %%a in (LogName.txt) do ( echo %%a>>MyDestination.txt )