Пакетні файли: як читати файл?


97

Як ви можете прочитати файл (текстовий або двійковий) з пакетного файлу? Є спосіб прочитати його у двійковому або текстовому режимі?


@ RookieTEC9: так, я знаю, що це 2 абсолютно різні речі, але мені потрібна відповідь, яка працювала в msdos, а не windows nt (або новіших версіях), також це питання було задано 7 років тому, майте це на увазі
Лукас Габріель Санчес

@ RookieTEC9: Я думаю, ти маєш рацію, минуло певний час. Я просто видалю тег ms-dos
Лукас Габріель Санчес,

1
Ви можете використовувати команду TYPE [fileName]для MS-Dos.
RookieTEC9

спробувати це він працював для мене - stackoverflow.com/a/31919715/4534414
Anurag_BEHS

Відповіді:


40

Ви можете використовувати для команди:

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

Тип

for /?

в командному рядку. Крім того, ви можете розібрати файли ini !


25
Це досить складний приклад, який аналізує дуже конкретну інформацію з особливо форматованого текстового файлу, не даючи жодних пояснень. Згідно for /?з командою буде проаналізовано кожен рядок у myfile.txt, ігноруючи рядки, які починаються з крапки з комою, передаючи 2-й та 3-й жетони від кожного рядка до тіла для тіленів, розміщених комами та / або пробілами.
Мартін Прикрил

2
Ваш приклад із довідки cmd.exe. Ви повинні додати підказку для цього або скопіювати весь опис.
Чт. Thielemann

70

У розділі cmd.exe у стилі NT ви можете провести цикл через рядки текстового файлу

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

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


22
Це повинно бути %%i.
Джим Фелл

32
Ця команда перестане читати рядок, якби знайшла символ пробілу. Я врешті-решт використав FOR / F "tokens = *" %% i IN (file.txt) DO @ECHO %% i
Jason

9
Це працює! і якщо ви використовуєте консоль, спробуйте% i, якщо ви використовуєте файл bat, спробуйте %% i.
Стівен Дю

41

В основному FOR-LOOP працює, але є деякі проблеми. FOR не приймає порожні рядки, а рядки з більш ніж ~ 8190 є проблематичними. Розширення працює лише надійно, якщо відкладене розширення вимкнено.

Виявлення CR / LF порівняно з одиночним LF також здається трохи складним.
Також символи NUL є проблематичними, оскільки FOR-Loop негайно скасовує читання.

Тому пряме двійкове читання здається майже неможливим.

Проблему з порожніми рядками можна вирішити хитрістю. Поставте префікс до кожного рядка номером рядка, використовуючи команду 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 , інакше знаки оклику видаляються, а піклування використовуються як (вторинні) символи втечі, і вони також видаляються.
Але використання змінної varбезпечно лише за допомогою EnabledDelayedExpansion , оскільки навіть запереченняcall %%var%% не вдасться із таким вмістом "&"&.

EDIT: Доданий варіант 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: перетворення бінарного файлу в HEX-представлення за допомогою пакетного файлу


Дякуємо за вказівник на використання set /p. Я використав set /p value=< result.txtперший рядок із текстового файлу
SteveC

Джебе, я задав відповідне запитання на основі вашого рішення вище в stackoverflow.com/questions/11408295/…
Ніколас

Що з символом EOF (в кінці файлу), ASCII 0x1A? дійсно for /Fповодяться так само, як і з NUL ( 0x00) символів?
aschipfl

@aschipfl Я припускаю, що 0x1A поводиться в деяких випадках, як передача даних у рядку (а краще, це перекладається на прямий канал). Чи є спосіб створити SUB без використання тимчасового файлу?
Джеб

це повинно бути прийнято відповідати, це нескладне , навіть якщо рядки починаються з :або ;або містить!
HackingAddict1337

11

Один дуже простий спосіб зробити це - використовувати таку команду:

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

Це відобразить лише перший рядок тексту в текстовому файлі. Інший спосіб це зробити - скористатися такою командою:

type %pathtotextfile%\textfile.txt

Це виведе всі дані в текстовий файл на екран. Сподіваюся, це допомагає!


1

Ну є безліч різних способів, але якщо ви хочете лише ВІДКРИТИ текст, а не зберігати його в будь-якому місці, ви просто використовуєте: findstr /v "randomtextthatnoonewilluse" filename.txt


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
тип% ім'я файлу% >>% filecontent%
echo% filecontent%


3
будь ласка, спробуйте код перед публікацією. Це просто дурниці.
Стефан

Що тут відбувається? Я не маю сенсу
Герхард
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.