ไฟล์แบทช์: จะอ่านไฟล์ได้อย่างไร?


102

คุณสามารถอ่านไฟล์ (ข้อความหรือไบนารี) จากไฟล์แบตช์ได้อย่างไร? มีวิธีอ่านในโหมดไบนารีหรือโหมดข้อความ?


@ RookieTEC9: ใช่ฉันรู้ว่ามันเป็น 2 สิ่งที่แตกต่างกันโดยสิ้นเชิง แต่ฉันต้องการคำตอบที่ใช้งานได้ใน msdos ไม่ใช่ windows nt (หรือเวอร์ชันที่ใหม่กว่า) คำถามนี้ถูกถามเมื่อ 7 ปีก่อนด้วยเช่นกัน
ลูคัสกาเบรียล Sánchez

@ RookieTEC9: ฉันคิดว่าคุณพูดถูกมันผ่านมาสักพักแล้ว ฉันจะลบแท็ก ms-dos
Lucas Gabriel Sánchez

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 จากแต่ละบรรทัดไปยังส่วนเนื้อหาโดยโทเค็นคั่นด้วยเครื่องหมายจุลภาคและ / หรือช่องว่าง
Martin Prikryl

3
ตัวอย่างของคุณมาจากความช่วยเหลือของ cmd.exe คุณควรเพิ่มคำใบ้หรือคัดลอกคำอธิบายทั้งหมด
ธ . Thielemann

71

ภายใต้ cmd.exe แบบ NT คุณสามารถวนซ้ำบรรทัดของไฟล์ข้อความด้วยไฟล์

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

พิมพ์ "help for" บนพรอมต์คำสั่งเพื่อดูข้อมูลเพิ่มเติม (ไม่รู้ว่ามันใช้ได้กับ "DOS" อะไรก็ตามที่คุณใช้อยู่)


22
%%iมันควรจะเป็น
Jim Fell

33
คำสั่งนี้จะเลิกอ่านบรรทัดหากพบอักขระเว้นวรรค ในที่สุดฉันก็ใช้ FOR / F "tokens = *" %% i IN (file.txt) DO @ECHO %% i
Jason

9
มันได้ผล! และหากคุณใช้คอนโซลลอง% i ถ้าคุณใช้ไฟล์ bat ให้ลองใช้ %% i
Steven Du

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
)

สามารถเลือกเปิดใช้งานและการขยายตัวล่าช้าพิการเป็นสิ่งจำเป็นสำหรับการทำงานที่ปลอดภัยกับสตริงเหมือนหรือ! นั่นเป็นเพราะบรรทัดนั้นปลอดภัยกับDisabledDelayedExpansionเท่านั้นเครื่องหมายอัศเจรีย์อื่น ๆ จะถูกลบออกและเครื่องหมายจะถูกใช้เป็นอักขระหลีก (รอง) และจะถูกลบออกไปด้วย แต่การใช้ตัวแปรจะปลอดภัยกับEnabledDelayedExpansionเท่านั้นเนื่องจากจะล้มเหลวด้วยเนื้อหาเช่น.^^^xy!z
set "var=%%a"
varcall %%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: การแปลงไฟล์ไบนารีเป็นการแสดง HEX โดยใช้ไฟล์แบตช์


ขอบคุณสำหรับตัวชี้ในการใช้set /p. ฉันใช้set /p value=< result.txtรับบรรทัดแรกจากไฟล์ข้อความ
SteveC

เจ๊บฉันถามคำถามที่เกี่ยวข้องตามวิธีแก้ปัญหาของคุณข้างบนในstackoverflow.com/questions/11408295/…
Nicholas

แล้วอักขระ EOF (end-of-file), ASCII 0x1Aล่ะ? ไม่for /Fทำงานในลักษณะเช่นเดียวกับกับ (NUL 0x00) ตัวละคร?
aschipfl

@aschipfl ฉันคิดว่า 0x1A ทำงานในบางกรณีเช่น linefeed (หรือดีกว่าแปลเป็น linefeed) มีวิธีสร้าง SUB โดยไม่ใช้ไฟล์ชั่วคราวหรือไม่?
jeb

1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับมันไม่สามารถเข้าใจผิดได้แม้ว่าบรรทัดจะขึ้นต้นด้วย:หรือ;หรือมี!
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

ของรหัสหลักของหน้า เครื่องหมายคำพูดไม่ได้วางตำแหน่งอย่างถูกต้องรหัสไม่เหมาะสำหรับไฟล์ที่มีชื่อที่มีช่องว่าง เหมืองคือ. ฉันให้เคล็ดลับของ ^^^^
Celes

คุณถูกต้องกับเครื่องหมายคำพูดรอบ ๆ ชื่อไฟล์ แต่รหัสของคุณมีปัญหาบางอย่าง: eol=และdelims=ไม่จำเป็นset line=%%aควรใช้เครื่องหมายคำพูดและหากไม่สลับโหมดขยายล่าช้าโค้ดจะไม่สามารถอ่านเครื่องหมายอัศเจรีย์ได้
jeb

-5

รหัสที่แสดงเนื้อหาของไฟล์ myfile.txt บนหน้าจอ

ตั้งค่า% filecontent% = 0
ประเภท% filename% >>% filecontent%
echo% filecontent%


3
อย่างน้อยโปรดลองใช้รหัสก่อนโพสต์ นั่นเป็นเพียงเรื่องไร้สาระ
Stephan

เกิดขึ้นที่นี่คืออะไร? ฉันไม่มีเหตุผล
Gerhard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.