बैच फाइलें: फाइल कैसे पढ़ें?


97

आप बैच फ़ाइल से फ़ाइल (पाठ या बाइनरी) कैसे पढ़ सकते हैं? बाइनरी मोड या टेक्स्ट मोड में इसे पढ़ने का एक तरीका है?


@ RookieTEC9: हाँ, मुझे पता है कि वे 2 पूरी तरह से अलग चीजें हैं, लेकिन मुझे एक उत्तर की आवश्यकता थी जो कि msdos में काम करता है, न कि विंडोज़ एनटी (या नए संस्करण), यह सवाल भी 7 साल पहले पूछा गया था, यह ध्यान में रखते हुए
लुकास गेब्रियल सांचेज़

@ RookieTEC9: मुझे लगता है कि आप सही हैं, इसके बाद से कुछ समय हो गया है। मैं सिर्फ ms-dos टैग
Lucas Gabriel Sánchez

1
आप TYPE [fileName]MS-Dos के लिए कमांड का उपयोग कर सकते हैं ।
रोके

यह मेरे लिए काम करने की कोशिश करो - 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 फ़ाइलों को पार्स कर सकते हैं !


26
यह एक बहुत ही जटिल उदाहरण है, विशेष रूप से स्वरूपित पाठ फ़ाइल से बहुत विशिष्ट जानकारी को पार्स करना, बिना कोई विवरण दिए। for /?कमांड के अनुसार myfile.txt में प्रत्येक लाइन को पार्स करेगा, सेमीकोलन से शुरू होने वाली लाइनों को अनदेखा करते हुए, बॉडी के लिए प्रत्येक लाइन से 2nd और 3rd टोकन पास करके, कॉमा और / या रिक्त स्थान द्वारा सीमांकित टोकन के साथ।
मार्टिन प्रिक्रील

3
आपका उदाहरण cmd.exe की सहायता से है। आपको उसके लिए एक संकेत जोड़ना चाहिए या पूरे विवरण को कॉपी करना चाहिए।
गु। थिलेमन

70

NT- शैली cmd.exe के तहत, आप एक पाठ फ़ाइल की पंक्तियों के माध्यम से लूप कर सकते हैं

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

अधिक जानकारी के लिए कमांड प्रॉम्प्ट पर "हेल्प फॉर" टाइप करें। (यदि आप जो "डॉस" इस्तेमाल कर रहे हैं उसमें काम नहीं करता है)


22
यह होना चाहिए %%i
जिम फेल

32
यदि यह व्हॉट्सएप कैरेक्टर पाता तो यह कमांड एक लाइन पढ़ना छोड़ देता। मैंने आखिरकार / F "टोकन = *" %% i IN (file.txt) DO @ECHO %% i
जेसन

9
यह काम करता हैं! और यदि आप कंसोल की कोशिश कर रहे हैं तो मैं% i का उपयोग कर रहा हूं यदि आप बैट फाइल का उपयोग कर रहे हैं तो %% i का प्रयास करें।
स्टीवन डू

41

फॉर-लूप आम तौर पर काम करता है, लेकिन कुछ मुद्दे हैं। के लिए खाली लाइनों को स्वीकार नहीं करता है और ~ 8190 से अधिक के साथ लाइनें समस्याग्रस्त हैं। यदि विलंबित विस्तार अक्षम है, तो विस्तार केवल विश्वसनीय कार्य करता है।

सीआर / एलएफ बनाम एकल एलएफ का पता लगाना भी थोड़ा जटिल लगता है।
इसके अलावा NUL अक्षर समस्याग्रस्त हैं, क्योंकि फॉर-लूप तुरंत पढ़ने को रद्द कर देता है।

प्रत्यक्ष बाइनरी पढ़ना इसलिए लगभग असंभव लगता है।

खाली लाइनों के साथ समस्या को एक चाल से हल किया जा सकता है। प्रत्येक पंक्ति को पंक्ति संख्या के साथ उपसर्ग करें, फिर से खोज आदेश का उपयोग करके, और पढ़ने के बाद, उपसर्ग को हटा दें।

@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%%जैसी सामग्री के साथ भी विफल हो जाएगा "&"&

संपादित करें: जोड़ा गया सेट / पी संस्करण
एक फ़ाइल को पढ़ने का दूसरा तरीका है 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!
  )
)

हेक्स-प्रतिनिधित्व में इसे "बाइनरी" पढ़ने के लिए
आप एसओ को देख सकते हैं : बैच फ़ाइल का उपयोग करके बाइनरी फ़ाइल को हेक्स प्रतिनिधित्व में परिवर्तित करना


के उपयोग पर सूचक के लिए धन्यवाद set /p। मैंने set /p value=< result.txtएक टेक्स्ट फ़ाइल से पहली पंक्ति प्राप्त की
स्टीवेक


EOF (एंड-ऑफ़-फ़ाइल) वर्ण, ASCII के बारे में क्या 0x1A? for /FNUL ( 0x00) वर्णों के समान व्यवहार करता है ?
aschipfl

@aschipfl मुझे लगता है कि 0x1A कुछ मामलों में एक लाइनफीड की तरह व्यवहार करता है (या बेहतर है कि यह एक लाइनफीड के लिए अनुवादित है)। एक अस्थायी फ़ाइल का उपयोग किए बिना एक सब बनाने का एक तरीका है?
jeb

इस स्वीकार किए जाते हैं जवाब होना चाहिए, यह सरल भले ही लाइनों के साथ शुरू है :या ;या शामिल!
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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.