Respostas:
As postagens abaixo ajudaram bastante, mas não fizeram o que eu disse na minha pergunta, onde eu precisava processar a linha inteira como um todo. Aqui está o que eu achei para trabalhar.
for /F "tokens=*" %%A in (myfile.txt) do [process] %%A
A palavra-chave tokens com um asterisco (*) puxará todo o texto da linha inteira. Se você não colocar o asterisco, ele puxará apenas a primeira palavra da linha. Suponho que tenha a ver com espaços.
Aprecio todas as postagens!
Se houver espaços no caminho do arquivo, você precisará usar usebackq
. Por exemplo.
for /F "usebackq tokens=*" %%A in ("my file.txt") do [process] %%A
for /F "tokens=*" %%A in ("myfile.txt") do echo A = %%A
-> A = myfile.txt
. Alguma idéia de como impedir isso?
Na referência de linha de comando do Windows:
Para analisar um arquivo, ignorando as linhas comentadas, digite:
for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k
Este comando analisa cada linha no Myfile.txt, ignorando as linhas que começam com ponto e vírgula e passando o segundo e o terceiro token de cada linha para o corpo FOR (os tokens são delimitados por vírgulas ou espaços). O corpo da instrução FOR faz referência a% i para obter o segundo token,% j para obter o terceiro token e% k para obter todos os tokens restantes.
Se os nomes de arquivo que você fornecer contiverem espaços, use aspas ao redor do texto (por exemplo, "Nome do arquivo"). Para usar aspas, você deve usar usebackq. Caso contrário, as aspas são interpretadas como definindo uma sequência literal para análise.
A propósito, você pode encontrar o arquivo de ajuda da linha de comando na maioria dos sistemas Windows em:
"C:\WINDOWS\Help\ntcmds.chm"
usebackq
" : for /f "usebackq" %%a in ("Z:\My Path Contains Spaces\xyz\abc.txt")
Em um arquivo em lotes, você DEVE usar em %%
vez de %
: (tipo help for
)
for /F "tokens=1,2,3" %%i in (myfile.txt) do call :process %%i %%j %%k
goto thenextstep
:process
set VAR1=%1
set VAR2=%2
set VAR3=%3
COMMANDS TO PROCESS INFORMATION
goto :EOF
O que isso faz: O comando "do call: process %% i %% j %% k" no final do comando for passa as informações adquiridas no comando for do myfile.txt para a "sub-rotina" do processo.
Ao usar o comando for em um programa em lote, é necessário usar o dobro de sinais de% para as variáveis.
As linhas a seguir passam essas variáveis do comando for para a sub-rotina do processo e permitem processar essas informações.
set VAR1=%1
set VAR2=%2
set VAR3=%3
Eu tenho alguns usos bastante avançados dessa configuração exata que eu gostaria de compartilhar se mais exemplos forem necessários. Adicione seu EOL ou Delims conforme necessário, é claro.
Melhorando a primeira resposta "FOR / F ..": O que eu tinha que fazer era chamar executar todos os scripts listados em MyList.txt, por isso funcionou para mim:
for /F "tokens=*" %A in (MyList.txt) do CALL %A ARG1
--OR, se você deseja fazer isso através da linha múltipla:
for /F "tokens=*" %A in (MuList.txt) do (
ECHO Processing %A....
CALL %A ARG1
)
Edit: O exemplo dado acima é para executar o loop FOR no prompt de comando; a partir de um script em lote, é necessário adicionar uma% extra, como mostrado abaixo:
---START of MyScript.bat---
@echo off
for /F "tokens=*" %%A in ( MyList.TXT) do (
ECHO Processing %%A....
CALL %%A ARG1
)
@echo on
;---END of MyScript.bat---
@ A resposta de MrKraus é instrutiva. Além disso, deixe-me acrescentar que, se você deseja carregar um arquivo localizado no mesmo diretório que o arquivo em lotes, prefixe o nome do arquivo com% ~ dp0. Aqui está um exemplo:
cd /d %~dp0
for /F "tokens=*" %%A in (myfile.txt) do [process] %%A
NB:: Se o nome ou diretório do seu arquivo (por exemplo, meuarquivo.txt no exemplo acima) tiver um espaço (por exemplo, 'meu arquivo.txt' ou 'c: \ Arquivos de Programas'), use:
for /F "tokens=*" %%A in ('type "my file.txt"') do [process] %%A
, com a palavra-chave type chamando o type
programa, que exibe o conteúdo de um arquivo de texto. Se você não deseja sofrer a sobrecarga de chamar o comando type, deve alterar o diretório para o diretório do arquivo de texto. Observe que o tipo ainda é necessário para nomes de arquivos com espaços.
Espero que isso ajude alguém!
**cd /d %~dp0**
antes do loop for. Isto faria com que se você está fazendo referência a um arquivo no diretório do arquivo de lote está em Obrigado pela observação.
type
walkaround
type
, tive que citar meu nome de arquivo porque ele está em um diretório diferente que contém espaços (droga Program Files
). Estou recebendo um erroThe system cannot find the file `type.
A resposta aceita é boa, mas tem duas limitações.
Ele deixa linhas vazias e linhas começando com;
Para ler linhas de qualquer conteúdo, você precisa da técnica de alternância de expansão com atraso.
@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ text.txt"`) do (
set "var=%%a"
SETLOCAL EnableDelayedExpansion
set "var=!var:*:=!"
echo(!var!
ENDLOCAL
)
O Findstr é usado para prefixar cada linha com o número da linha e dois pontos, para que as linhas vazias não estejam mais vazias.
O DelayedExpansion precisa ser desativado ao acessar o %%a
parâmetro, além de pontos de exclamação !
e pontos de intercalação^
serão perdidos, pois eles têm significados especiais nesse modo.
Mas, para remover o número da linha, a expansão atrasada precisa estar ativada.
set "var=!var:*:=!"
remove todos até o primeiro dois pontos (usando delims=:
também removeria todos os dois pontos no início de uma linha, não apenas o de findstr).
O local final desativa a expansão atrasada novamente para a próxima linha.
A única limitação agora é o limite de comprimento de linha de ~ 8191, mas parece não haver maneira de superar isso.
setlocal
na linha de comando. Quando executo código no CMD, recebo! Var! em vez de espaços em branco. Como consertar?
Aqui está um arquivo bat que escrevi para executar todos os scripts SQL em uma pasta:
REM ******************************************************************
REM Runs all *.sql scripts sorted by filename in the current folder.
REM To use integrated auth change -U <user> -P <password> to -E
REM ******************************************************************
dir /B /O:n *.sql > RunSqlScripts.tmp
for /F %%A in (RunSqlScripts.tmp) do osql -S (local) -d DEFAULT_DATABASE_NAME -U USERNAME_GOES_HERE -P PASSWORD_GOES_HERE -i %%A
del RunSqlScripts.tmp
Se você tem um NT-família Windows (um com cmd.exe
como o shell), tente o comando FOR / F .
O respondente aceito usando cmd.exe
e
for /F "tokens=*" %F in (file.txt) do whatever "%F" ...
funciona apenas para arquivos "normais". Ele falha miseravelmente com arquivos enormes.
Para arquivos grandes, pode ser necessário usar o Powershell e algo assim:
[IO.File]::ReadLines("file.txt") | ForEach-Object { whatever "$_" }
ou se você tiver memória suficiente:
foreach($line in [System.IO.File]::ReadLines("file.txt")) { whatever "$line" }
Isso funcionou para mim com um arquivo de 250 MB contendo mais de 2 milhões de linhas, onde o for /F ...
comando ficou bloqueado após alguns milhares de linhas.
Para as diferenças entre foreach
e ForEach-Object
, consulte Conhecendo o ForEach e o ForEach-Object .
(créditos: Leia o arquivo linha por linha no PowerShell )
Exemplos modificados aqui para listar nossos aplicativos Rails no Heroku - obrigado!
cmd /C "heroku list > heroku_apps.txt"
find /v "=" heroku_apps.txt | find /v ".TXT" | findstr /r /v /c:"^$" > heroku_apps_list.txt
for /F "tokens=1" %%i in (heroku_apps_list.txt) do heroku run bundle show rails --app %%i
Código completo aqui .
for /f "tokens=1" %%i in ('find /v "=" heroku_apps.txt ^| find /v ".TXT" ^| findstr /r /v /c:"^$"') do...
(observe a adição de ^
's usados para escapar do pipe, para que ele seja passado ao for
e não diretamente ao processador de comandos)
Para imprimir todas as linhas no arquivo de texto a partir da linha de comando (com delayedExpansion):
set input="path/to/file.txt"
for /f "tokens=* delims=[" %i in ('type "%input%" ^| find /v /n ""') do (
set a=%i
set a=!a:*]=]!
echo:!a:~1!)
Funciona com espaços em branco à esquerda, linhas em branco, linhas de espaços em branco.
Testado no Win 10 CMD
]]]
de linhas, a segunda amostra cai linhas vazias e linhas iniciadas com espaço
delims
se qualquer linha do arquivo de texto começar com, ]
por exemplo. substitua por um caractere que não existe ou um caractere de controle como backspace ou bell; eles não são normalmente encontrados em arquivos de texto. A razão para delims=]
se remover espaços reservados criada por /n
de find
comando para preservar as linhas em branco.
%%A
por%A
no comando acima. Caso contrário, você receberá%%A was unexpected at this time.
.