Пакетные файлы: как читать файл?

102

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

Лукас Габриэль Санчес
источник
@ RookieTEC9: да, я знаю, что это 2 совершенно разные вещи, но мне нужен был ответ, который работал бы в msdos, а не в Windows NT (или более новых версиях), также этот вопрос задавали 7 лет назад, имейте это в виду
Лукас Габриэль Sánchez
@ RookieTEC9: Думаю, ты прав, с тех пор прошло много времени. Я просто удалю тег ms-dos
Лукас Габриэль Санчес
1
Вы можете использовать команду TYPE [fileName]для MS-Dos.
Roke
попробуйте, это сработало для меня - stackoverflow.com/a/31919715/4534414
Anurag_BEHS

Ответы:

40

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

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

Тип

for /?

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

Джонсток
источник
28
Это довольно сложный пример, анализирующий очень конкретную информацию из специально отформатированного текстового файла без каких-либо объяснений. В соответствии for /?с командой будет анализировать каждую строку в myfile.txt, игнорируя строки, начинающиеся с точки с запятой, передавая 2-й и 3-й токены из каждой строки в тело for, с токенами, разделенными запятыми и / или пробелами.
Мартин Прикрыл
3
Ваш пример взят из справки cmd.exe. Для этого следует добавить подсказку или скопировать все описание.
Чт. Thielemann
71

В cmd.exe в стиле NT вы можете перебирать строки текстового файла с помощью

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

Для получения дополнительных сведений введите в командной строке «справка для». (не знаю, работает ли это в той "DOS", которую вы используете)

девио
источник
22
Так и должно быть %%i.
Джим Фелл,
33
Эта команда прекратит чтение строки, если обнаружит пробельный символ. В конце концов я использовал FOR / F "tokens = *" %% i IN (file.txt) DO @ECHO %% i
Джейсон,
9
Оно работает! и если вы используете консоль, попробуйте% i, если вы используете bat-файл, попробуйте %% i.
Стивен Дю
41

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 , так как даже a не call %%var%%будет работать с таким содержимым, как "&"&.

РЕДАКТИРОВАТЬ: добавлен вариант set / 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: преобразование двоичного файла в шестнадцатеричное представление с использованием пакетного файла

Jeb
источник
Спасибо за указатель на использование set /p. Я использовал set /p value=< result.txtполучение первой строки из текстового файла
SteveC
Джеб, я задал связанный вопрос, основанный на вашем решении, приведенном выше, в stackoverflow.com/questions/11408295/…
Николас
А как насчет символа конца файла (EOF), ASCII 0x1A? ведет for /Fсебя так же, как и с 0x00символами NUL ( )?
aschipfl 01
@aschipfl Я полагаю, что 0x1A в некоторых случаях ведет себя как перевод строки (или, лучше, он переводится в перевод строки). Есть ли способ создать SUB без использования временного файла?
jeb
1
это должен быть принятый ответ, он надежен, даже если строки начинаются с :или ;или содержат!
HackingAddict1337
11

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

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

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

type %pathtotextfile%\textfile.txt

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

Дж. Бонд
источник
1

Что ж, есть много разных способов, но если вы хотите только ОТОБРАЖАТЬ текст, а не СОХРАНИТЬ его где-либо, вы просто используете: findstr /v "randomtextthatnoonewilluse" filename.txt

NetvorMcWolf
источник
0

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

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=и delims=они излишни, set line=%%aдолжны использовать кавычки и без переключения режима отложенного расширения, код не может читать восклицательные знаки
jeb
-5

Код, отображающий на экране содержимое файла myfile.txt.

установить% filecontent% = 0
type% filename% >>% filecontent%
echo% filecontent%

Яни Пьервши
источник
3
пожалуйста, хотя бы попробуйте код перед публикацией. Это чушь.
Стефан
Что здесь происходит? Я не понимаю
Герхард