Pliki wsadowe: jak odczytać plik?


102

Jak odczytać plik (tekstowy lub binarny) z pliku wsadowego? Czy jest sposób na odczytanie go w trybie binarnym lub tekstowym?


@ RookieTEC9: tak, wiem, że to dwie zupełnie różne rzeczy, ale potrzebowałem odpowiedzi, która działała w msdos, a nie w windows nt (lub nowszych wersjach), również to pytanie zostało zadane 7 lat temu, miej to na uwadze
Lucas Gabriel Sánchez

@ RookieTEC9: Myślę, że masz rację, minęło trochę czasu od tego. Po prostu usunę tag ms-dos
Lucas Gabriel Sánchez

1
Możesz użyć polecenia TYPE [fileName]dla MS-Dos.
Roke

wypróbuj to zadziałało dla mnie - stackoverflow.com/a/31919715/4534414
Anurag_BEHS

Odpowiedzi:


40

Możesz użyć polecenia for:

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

Rodzaj

for /?

w wierszu polecenia. Możesz także analizować pliki ini !


28
Jest to dość złożony przykład, analizujący bardzo szczegółowe informacje ze specjalnie sformatowanego pliku tekstowego, bez podawania jakichkolwiek wyjaśnień. Zgodnie for /?z poleceniem przeanalizowałoby każdą linię w myfile.txt, ignorując wiersze zaczynające się od średnika, przekazując drugi i trzeci token z każdego wiersza do for body, z tokenami oddzielonymi przecinkami i / lub spacjami.
Martin Prikryl

3
Twój przykład pochodzi z pomocy cmd.exe. Dodaj do tego wskazówkę lub skopiuj cały opis.
Cz. Thielemann

71

W programie cmd.exe w stylu NT można przeglądać wiersze pliku tekstowego za pomocą

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

Aby uzyskać więcej informacji, wpisz „pomoc dla” w wierszu polecenia. (nie wiem, czy to działa w jakimkolwiek systemie „DOS”, którego używasz)


22
Tak powinno być %%i.
Jim Fell

33
Polecenie to przerwałoby czytanie linii, gdyby znalazło biały znak. Ostatecznie użyłem FOR / F "tokens = *" %% i IN (file.txt) DO @ECHO %% i
Jason

9
To działa! a jeśli używasz konsoli, wypróbuj% i, jeśli używasz pliku bat, a następnie %% i.
Steven Du

41

FOR-LOOP generalnie działa, ale są pewne problemy. FOR nie akceptuje pustych wierszy, a wiersze zawierające więcej niż ~ 8190 są problematyczne. Rozszerzenie działa niezawodnie tylko wtedy, gdy opóźnione rozszerzenie jest wyłączone.

Wykrywanie CR / LF w porównaniu z pojedynczym LF również wydaje się nieco skomplikowane.
Również znaki NUL są problematyczne, ponieważ pętla FOR natychmiast anuluje odczyt.

Dlatego bezpośredni odczyt binarny wydaje się prawie niemożliwy.

Problem z pustymi liniami można rozwiązać sztuczką. Przedrostek każdego wiersza numerem wiersza za pomocą polecenia findstr i po przeczytaniu usuń przedrostek.

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

Przełączanie między włączaniem a wyłączaniem opóźnionej ekspansji jest konieczne do bezpiecznego działania z ciągami, takimi jak !lub ^^^xy!z. Dzieje się tak
, ponieważ linia set "var=%%a"jest bezpieczna tylko z DisabledDelayedExpansion , w przeciwnym razie wykrzykniki są usuwane, a daszki są używane jako (drugorzędne) znaki zmiany znaczenia i są również usuwane.
Ale używanie zmiennej varjest bezpieczne tylko w przypadku EnabledDelayedExpansion , ponieważ nawet call %%var%%nie powiedzie się w przypadku zawartości takiej jak "&"&.

EDYCJA: Dodano wariant set / p
Istnieje drugi sposób odczytu pliku set /p, jedynymi wadami jest to, że jest on ograniczony do ~ 1024 znaków na linię i usuwa znaki sterujące na końcu linii.
Ale zaletą jest to, że nie potrzebujesz opóźnionego przełączania i łatwiej jest przechowywać wartości w zmiennych

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

Aby odczytać to "binarnie" na reprezentację szesnastkową
Możesz spojrzeć na SO: konwersja pliku binarnego na reprezentację HEX przy użyciu pliku wsadowego


Dzięki za wskazówkę dotyczącą korzystania z set /p. Użyłem set /p value=< result.txtpobrać pierwszą linię z pliku tekstowego
SteveC

Jeb, zadałem podobne pytanie w oparciu o twoje rozwiązanie powyżej na stackoverflow.com/questions/11408295/…
Nicholas

A co ze znakiem EOF (koniec pliku), ASCII 0x1A? nie for /Fzachowują się w ten sam sposób jak przy NUL ( 0x00) znaków?
aschipfl

@aschipfl Przypuszczam, że 0x1A zachowuje się w niektórych przypadkach jak wysuw (lub lepiej jest tłumaczony na wysuw). Czy istnieje sposób na utworzenie SUB bez użycia pliku tymczasowego?
jeb

1
to powinna być akceptowana odpowiedź, jest niezawodna, nawet jeśli linie zaczynają się od :lub ;lub zawierają!
HackingAddict1337

11

Jednym z bardzo łatwych sposobów jest użycie następującego polecenia:

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

Spowoduje to wyświetlenie tylko pierwszej linii tekstu w pliku tekstowym. Innym sposobem, w jaki możesz to zrobić, jest użycie następującego polecenia:

type %pathtotextfile%\textfile.txt

Spowoduje to umieszczenie wszystkich danych w pliku tekstowym na ekranie. Mam nadzieję że to pomoże!


1

Cóż, istnieje wiele różnych sposobów, ale jeśli chcesz tylko WYŚWIETLIĆ tekst, a nie przechowywać go nigdzie, po prostu użyj: findstr /v "randomtextthatnoonewilluse" filename.txt


0

Poprawiony kod:

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

Głównego kodu strony. Cudzysłowy nie są ustawione poprawnie, kod nie jest odpowiedni dla plików o nazwie ze spacjami. Mój jest. Podaję tutaj sztuczkę z ^^^^
Celes

Masz rację z cudzysłowami wokół nazwy pliku, ale twój kod ma pewne problemy: eol=i delims=jest zbędny, set line=%%apowinien używać cudzysłowów i bez przełączania trybu opóźnionego rozwinięcia, kod nie może odczytać wykrzykników
jeb

-5

Kod, który wyświetla zawartość pliku myfile.txt na ekranie

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


3
proszę przynajmniej spróbować kod przed wysłaniem. To po prostu bzdury.
Stephan

Co tu się dzieje? Nie ma sensu
Gerhard
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.