Arquivos em lote: como ler um arquivo?

97

Como você pode ler um arquivo (texto ou binário) de um arquivo em lote? Existe uma maneira de lê-lo em modo binário ou modo de texto?

Lucas Gabriel Sánchez
fonte
@ RookieTEC9: sim, eu sei que são 2 coisas completamente diferentes, mas eu precisava de uma resposta que funcionasse no msdos, não no windows nt (ou em versões mais recentes), também esta pergunta foi feita há 7 anos, tenha isso em mente
Lucas Gabriel Sánchez
@ RookieTEC9: Acho que você está certo, já faz um tempo desde isso. Vou apenas remover a tag ms-dos
Lucas Gabriel Sánchez
1
Você pode usar o comando TYPE [fileName]para MS-Dos.
RookieTEC9
experimente funcionou para mim - stackoverflow.com/a/31919715/4534414
Anurag_BEHS

Respostas:

40

Você pode usar o comando for:

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

Tipo

for /?

no prompt de comando. Além disso, você pode analisar arquivos ini !

johnstok
fonte
25
Este é um exemplo bastante complexo, analisando informações muito específicas de um arquivo de texto formatado em particular, sem dar nenhuma explicação. Conforme for /?o comando analisaria cada linha em meuarquivo.txt, ignorando as linhas que começam com um ponto e vírgula, passando o segundo e o terceiro token de cada linha para o corpo do for, com os tokens delimitados por vírgulas e / ou espaços.
Martin Prikryl
2
Seu exemplo é da ajuda do cmd.exe. Você deve adicionar uma dica para isso ou copiar toda a descrição.
Th. Thielemann
70

No cmd.exe estilo NT, você pode percorrer as linhas de um arquivo de texto com

FOR /F %i IN (file.txt) DO @echo %i

Digite "ajuda para" no prompt de comando para obter mais informações. (não sei se isso funciona em qualquer "DOS" que você está usando)

Devio
fonte
22
Deve ser %%i.
Jim Fell
32
Este comando deixaria de ler uma linha se encontrasse um caractere de espaço em branco. Acabei usando FOR / F "tokens = *" %% i IN (file.txt) DO @ECHO %% i
Jason
9
Funciona! e Se você estiver usando o console, tente% i se estiver usando um arquivo bat, tente %% i.
Steven Du
41

O FOR-LOOP geralmente funciona, mas existem alguns problemas. O FOR não aceita linhas vazias e linhas com mais de ~ 8190 são problemáticas. A expansão funciona apenas de forma confiável, se a expansão atrasada estiver desabilitada.

A detecção de CR / LF versus LF único também parece um pouco complicada.
Além disso, os caracteres NUL são problemáticos, pois um FOR-Loop cancela imediatamente a leitura.

A leitura binária direta parece, portanto, quase impossível.

O problema com linhas vazias pode ser resolvido com um truque. Prefixe cada linha com um número de linha, usando o comando findstr e, após a leitura, remova o prefixo.

@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    echo(!var!
    ENDLOCAL
)

Alternar entre a expansão retardada habilitada e desabilitada é necessária para o trabalho seguro com strings, como !ou ^^^xy!z.
Isso set "var=%%a"ocorre porque a linha só é segura com DisabledDelayedExpansion , caso contrário, os pontos de exclamação são removidos e os circunflexos são usados ​​como caracteres de escape (secundários) e também são removidos.
Mas usar a variável varsó é seguro com EnabledDelayedExpansion , pois até mesmo um call %%var%%irá falhar com conteúdo como "&"&.

EDITAR: Variante set / p adicionada
Há uma segunda maneira de ler um arquivo com set /p, as únicas desvantagens são que ele é limitado a ~ 1024 caracteres por linha e remove caracteres de controle no final da linha.
Mas a vantagem é que você não precisa da alternância atrasada e é mais fácil armazenar valores em variáveis

@echo off
setlocal EnableDelayedExpansion
set "file=%~1"

for /f "delims=" %%n in ('find /c /v "" %file%') do set "len=%%n"
set "len=!len:*: =!"

<%file% (
  for /l %%l in (1 1 !len!) do (
    set "line="
    set /p "line="
    echo(!line!
  )
)

Para lê-lo "binário" em uma representação hexadecimal
Você pode olhar para o SO: convertendo um arquivo binário em representação HEX usando um arquivo em lote

Jeb
fonte
Obrigado pela indicação sobre o uso de set /p. Eu costumava set /p value=< result.txtpegar a primeira linha de um arquivo de texto
SteveC
Jeb, fiz uma pergunta relacionada com base na sua solução acima em stackoverflow.com/questions/11408295/…
Nicholas
E quanto ao caractere EOF (fim de arquivo), ASCII 0x1A? se for /Fcomporta da mesma maneira que com caracteres NUL ( 0x00)?
aschipfl 01 de
@aschipfl Suponho que o 0x1A se comporta em alguns casos como um feed de linha (ou melhor, é traduzido para um feed de linha). Existe uma maneira de criar um SUB sem usar um arquivo temporário?
jeb
esta deve ser a resposta aceita, é infalível mesmo se as linhas começam com :ou ;ou contenham!
HackingAddict1337
11

Uma maneira muito fácil de fazer isso é usar o seguinte comando:

set /p mytextfile=< %pathtotextfile%\textfile.txt
echo %mytextfile%

Isso exibirá apenas a primeira linha de texto em um arquivo de texto. A outra maneira de fazer isso é usar o seguinte comando:

type %pathtotextfile%\textfile.txt

Isso colocará todos os dados do arquivo de texto na tela. Espero que isto ajude!

J. Bond
fonte
1

Bem, há muitas maneiras diferentes, mas se você quiser apenas EXIBIR o texto e não ARMAZENÁ-LO em qualquer lugar, basta usar: findstr /v "randomtextthatnoonewilluse" filename.txt

NetvorMcWolf
fonte
0

Código corrigido:

setlocal enabledelayedexpansion
for /f "usebackq eol= tokens=* delims= " %%a in (`findstr /n ^^^^ "name with spaces.txt"`) do (
    set line=%%a
    set "line=!line:*:=!"
    echo(!line!
)
endlocal
pause
Celes
fonte
Do código principal da página. As cotações não estão posicionadas corretamente, o código não é adequado para arquivos com nome com espaços. O meu é. Dou aqui o truque do ^^^^
Celes
Você está certo com as aspas ao redor do nome do arquivo, mas seu código tem alguns problemas: eol=e delims=são supérfluos, set line=%%adevem usar aspas e sem alternar o modo de expansão atrasada, o código não pode ler pontos de exclamação
jeb
-5

Um código que exibe o conteúdo do arquivo myfile.txt na tela

definir% filecontent% = 0
type% filename% >>% filecontent%
echo% filecontent%

Jani Pierwszy
fonte
3
por favor, pelo menos tente o código antes de postar. Isso é um disparate.
Stephan
O que está acontecendo aqui? Não faz sentido
Gerhard