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?
TYPE [fileName]
para MS-Dos.
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?
TYPE [fileName]
para MS-Dos.
Respostas:
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 !
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.
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)
%%i
.
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 var
só é 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
set /p
. Eu costumava set /p value=< result.txt
pegar a primeira linha de um arquivo de texto
0x1A
? se for /F
comporta da mesma maneira que com caracteres NUL ( 0x00
)?
:
ou ;
ou contenham!
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!
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
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
eol=
e delims=
são supérfluos, set line=%%a
devem usar aspas e sem alternar o modo de expansão atrasada, o código não pode ler pontos de exclamação