it-swarm.com.ru

Пакетные файлы: Как прочитать файл?

Как вы можете прочитать файл (текстовый или двоичный) из пакетного файла? Есть ли способ прочитать его в двоичном или текстовом режиме?

89
Lucas Gabriel Sánchez

Вы можете использовать для команды:

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

Тип

for /?

в командной строке. Также вы можете разбирать ini файлы !

40
johnstok

Под NT-style cmd.exe вы можете проходить по строкам текстового файла с помощью

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

Введите "help for" в командной строке для получения дополнительной информации. (не знаю, работает ли это в любой используемой вами DOS)

64
devio

FOR-LOOP обычно работает, но есть некоторые проблемы. FOR не принимает пустые строки, а строки с более чем 8190 проблематичны. Расширение работает только надежно, если отложенное расширение отключено.

Обнаружение CR/LF по сравнению с одиночным LF также кажется немного сложным.
Также NUL-символы проблематичны, так как цикл FOR немедленно отменяет чтение.

Прямое двоичное чтение кажется поэтому практически невозможным.

Проблема с пустыми строками может быть решена с помощью хитрости. Приставьте каждую строку к номеру строки, используя команду findstr, и после прочтения удалите префикс.

@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
)

Переключение между включенным и отключенным отложенным расширением необходимо для безопасной работы со строками, такими как ! или ^^^xy!z.
Это связано с тем, что строка set "var=%%a" безопасна только с DisabledDelayedExpansion , в противном случае восклицательные знаки удаляются, а вставки используются в качестве (вторичных) escape-символов и тоже удаляются.
Но использование переменной var безопасно только с EnabledDelayedExpansion , так как даже call %%var%% не будет работать с содержимым, подобным "&"&.

РЕДАКТИРОВАТЬ: Добавлен вариант набора/p
Существует второй способ чтения файла с set /p, единственными недостатками которого является то, что он ограничен ~ 1024 символами в строке и удаляет управляющие символы в конце строки.
Но преимущество в том, что вам не нужно было задерживать переключение, и легче хранить значения в переменных

@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!
  )
)

Для чтения "двоичного" в шестнадцатеричное представление
Вы можете посмотреть SO: преобразование двоичного файла в представление HEX с использованием пакетного файла

35
jeb

Один из очень простых способов сделать это - использовать следующую команду:

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

Это будет отображать только первую строку текста в текстовом файле. Другой способ сделать это - использовать следующую команду:

type %pathtotextfile%\textfile.txt

Это поместит все данные в текстовый файл на экран. Надеюсь это поможет!

6
J. Bond

Ну, есть много разных способов, но если вы хотите только отобразить текст, а не хранить его где-либо, то вы просто используете: findstr /v "randomtextthatnoonewilluse" filename.txt

1
NetvorMcWolf

Исправленный код:

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
0
Celes