Toplu iş dosyaları: Bir dosya nasıl okunur?


102

Bir toplu iş dosyasından bir dosyayı (metin veya ikili) nasıl okuyabilirsiniz? İkili modda veya metin modunda okumanın bir yolu var mı?


@ RookieTEC9: evet, bunların tamamen farklı 2 şey olduğunu biliyorum, ancak msdos'ta çalışan bir cevaba ihtiyacım vardı, windows nt'de (veya daha yeni sürümlerde) değil, bu soru da 7 yıl önce sorulmuştu, aklımda
Lucas Gabriel Sánchez

@ RookieTEC9: Sanırım haklısın, bundan bu yana uzun zaman geçti. Sadece ms-dos etiketini kaldıracağım
Lucas Gabriel Sánchez

1
TYPE [fileName]MS-Dos komutunu kullanabilirsiniz .
Roke

benim için çalıştı bunu deneyin - stackoverflow.com/a/31919715/4534414
Anurag_BEHS

Yanıtlar:


40

For komutunu kullanabilirsiniz:

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

Tür

for /?

komut isteminde. Ayrıca, ini dosyalarını ayrıştırabilirsiniz !


28
Bu, özellikle biçimlendirilmiş bir metin dosyasından çok özel bilgileri herhangi bir açıklama yapmadan ayrıştıran oldukça karmaşık bir örnektir. for /?Komut gereğince , myfile.txt'deki her satırı, noktalı virgülle başlayan satırları yok sayarak, her satırdan 2. ve 3. belirteci virgül ve / veya boşluklarla ayrılmış simgelerle for gövdesine geçirerek ayrıştırır.
Martin Prikryl

3
Örneğiniz cmd.exe'nin yardımından alınmıştır. Bunun için bir ipucu eklemeli veya tüm açıklamayı kopyalamalısınız.
Th. Thielemann

71

NT tarzı cmd.exe'nin altında, bir metin dosyasının satırları arasında geçiş yapabilirsiniz.

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

Daha fazla bilgi için komut istemine "için yardım" yazın. (kullandığınız "DOS" da işe yarayıp yaramadığını bilmiyorum)


22
Olmalı %%i.
Jim Fell

33
Bu komut, bir boşluk karakteri bulursa bir satırı okumayı bırakacaktır. Sonunda FOR / F "tokens = *" %% i IN (file.txt) DO @ECHO %% i
Jason

9
İşe yarıyor! ve konsol kullanıyorsanız, bir bat dosyası kullanıyorsanız% i'yi deneyin ve ardından %% i'yi deneyin.
Steven Du

41

FOR-LOOP genellikle çalışır, ancak bazı sorunlar vardır. FOR boş satırları kabul etmez ve ~ 8190'dan fazla olan satırlar sorunludur. Genişletme, yalnızca gecikmeli genişletme devre dışı bırakılırsa güvenilir çalışır.

Tek LF'ye karşı CR / LF'nin tespiti de biraz karmaşık görünmektedir.
Ayrıca, FOR-Loop okumayı anında iptal ettiği için NUL karakterleri de sorunludur.

Doğrudan ikili okuma bu nedenle neredeyse imkansız görünmektedir.

Boş satırlarla ilgili problem bir hile ile çözülebilir. Findstr komutunu kullanarak her satırın önüne bir satır numarası ekleyin ve okuduktan sonra öneki kaldırın.

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

!Veya gibi dizelerle güvenli çalışma için etkinleştirilen ve devre dışı bırakılan gecikmeli genişletme arasında geçiş yapılması gerekir ^^^xy!z.
Bunun nedeni, satırın set "var=%%a"yalnızca DisabledDelayedExpansion ile güvenli olmasıdır , aksi takdirde ünlem işaretleri kaldırılır ve düzeltme işaretleri (ikincil) kaçış karakterleri olarak kullanılır ve bunlar da kaldırılır.
Ama değişkeni kullanarak varsadece güvenlidir EnabledDelayedExpansion bile gibi call %%var%%gibi içerikle başarısız olur "&"&.

DÜZENLEME: set / p değişkeni eklendi
Bir dosyayı okumanın ikinci bir yolu var set /p, tek dezavantajı satır başına ~ 1024 karakterle sınırlı olması ve satır sonunda kontrol karakterlerini kaldırmasıdır.
Ancak avantajı, gecikmeli geçişe ihtiyacınız olmaması ve değerleri değişkenlerde saklamanın daha kolay olmasıdır.

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

Onaltılık gösterime "ikili" okumak için SO'ya
bakabilirsiniz : toplu iş dosyasını kullanarak bir ikili dosyayı HEX gösterimine dönüştürme


Kullanımındaki işaretçi için teşekkürler set /p. Ben kullanılan set /p value=< result.txtbir metin dosyasından ilk satırı almak
SteveC


EOF (dosya sonu) karakteri ASCII ne olacak 0x1A? yok for /FNUL (ile aynı şekilde davranacaktır 0x00) karakterler?
aschipfl

@aschipfl 0x1A'nın bazı durumlarda satır besleme gibi davrandığını (veya daha iyisi satır beslemeye çevrildiğini) varsayıyorum. Geçici dosya kullanmadan SUB oluşturmanın bir yolu var mı?
jeb

1
Bu satırlar ile başlamak bile şaşmaz var, kabul cevabı olmalı :ya ;ya içerirler!
HackingAddict1337

11

Bunu yapmanın çok kolay bir yolu aşağıdaki komutu kullanmaktır:

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

Bu, bir metin dosyasındaki metnin yalnızca ilk satırını görüntüler. Bunu yapmanın diğer yolu aşağıdaki komutu kullanmaktır:

type %pathtotextfile%\textfile.txt

Bu, tüm verileri ekrandaki metin dosyasına koyacaktır. Bu yardımcı olur umarım!


1

Pek çok farklı yol var, ancak metni yalnızca GÖRÜNTÜLEMEK ve herhangi bir yerde DEPOLAMAK istemiyorsanız, yalnızca şunu kullanın: findstr /v "randomtextthatnoonewilluse" filename.txt


0

Düzeltilmiş 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

Sayfanın ana kodunun. Alıntılar doğru konumlandırılmamış, kod, boşluklu ada sahip dosyalar için uygun değildir. Benimki. Burada ^ ^ ^ nin püf noktasını veriyorum
Celes

Dosya adının etrafındaki alıntılar konusunda haklısınız, ancak kodunuzda bazı sorunlar var: eol=ve delims=gereksiz, set line=%%atırnak kullanmalı ve gecikmeli genişletme modunu değiştirmeden kod ünlem işaretlerini okuyamıyor
jeb

-5

Myfile.txt dosyasının içeriğini ekranda görüntüleyen bir kod

% filecontent% = 0
yazın% dosya adı% >>% filecontent%
echo% filecontent%


3
lütfen en azından göndermeden önce kodu deneyin. Bu sadece saçmalık.
Stephan

Burada neler oluyor? Hiç mantıklı değil
Gerhard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.