Gostaria de saber como percorrer cada linha em um arquivo de texto usando um arquivo em lotes do Windows e processar cada linha de texto em sucessão.
windows
batch-file
Mr. Kraus
fonte
fonte
%%A
por%A
no comando acima. Caso contrário, você receberá%%A was unexpected at this time.
.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:
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:
fonte
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%
: (tipohelp for
)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.
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.
fonte
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:
--OR, se você deseja fazer isso através da linha múltipla:
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:
fonte
@ 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:
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:
, 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!
fonte
**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
walkaroundtype
, tive que citar meu nome de arquivo porque ele está em um diretório diferente que contém espaços (drogaProgram 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.
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 (usandodelims=:
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.
fonte
setlocal
na linha de comando. Quando executo código no CMD, recebo! Var! em vez de espaços em branco. Como consertar?Ou você pode excluir as opções entre aspas:
fonte
Aqui está um arquivo bat que escrevi para executar todos os scripts SQL em uma pasta:
fonte
Se você tem um NT-família Windows (um com
cmd.exe
como o shell), tente o comando FOR / F .fonte
O respondente aceito usando
cmd.exe
efunciona apenas para arquivos "normais". Ele falha miseravelmente com arquivos enormes.
Para arquivos grandes, pode ser necessário usar o Powershell e algo assim:
ou se você tiver memória suficiente:
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
eForEach-Object
, consulte Conhecendo o ForEach e o ForEach-Object .(créditos: Leia o arquivo linha por linha no PowerShell )
fonte
Exemplos modificados aqui para listar nossos aplicativos Rails no Heroku - obrigado!
Código completo aqui .
fonte
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 aofor
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):
Funciona com espaços em branco à esquerda, linhas em branco, linhas de espaços em branco.
Testado no Win 10 CMD
fonte
]]]
de linhas, a segunda amostra cai linhas vazias e linhas iniciadas com espaçodelims
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 paradelims=]
se remover espaços reservados criada por/n
defind
comando para preservar as linhas em branco.