উইন্ডোজ ব্যাচের ফাইলটি ব্যবহার করে আপনি কোনও পাঠ্য ফাইলের প্রতিটি লাইনটি কীভাবে লুপ করবেন?


244

আমি জানতে চাই যে কীভাবে একটি উইন্ডোজ ব্যাচ ফাইল ব্যবহার করে একটি পাঠ্য ফাইলে প্রতিটি লাইনটি লুপ করা যায় এবং প্রতিটি পাঠ্যক্রমের ধারাবাহিকতায় প্রক্রিয়াজাত করা যায়।

উত্তর:


304

নীচের পোস্টগুলি ব্যাপকভাবে সহায়তা করেছে, তবে আমার প্রশ্নে আমি যা বলেছিলাম সেখানে সম্পূর্ণরূপে সম্পূর্ণ লাইনটি প্রক্রিয়া করার প্রয়োজন ছিল না। আমি যা কাজ করতে পেয়েছি তা এখানে।

for /F "tokens=*" %%A in (myfile.txt) do [process] %%A

তারকাচিহ্ন (*) সহ টোকেন কীওয়ার্ডটি পুরো লাইনের জন্য সমস্ত পাঠ্য টানবে। আপনি যদি নক্ষত্রটি না রাখেন তবে এটি কেবল প্রথম শব্দটি লাইনে টানবে। আমি ধরে নিলাম এটি স্পেসগুলির সাথে করার আছে।

টেকনেট অন কমান্ড জন্য

আমি পোস্ট সব প্রশংসা করি!


আপনার ফাইলের পথে যদি ফাঁকা স্থান থাকে তবে আপনাকে ব্যবহার করা দরকার usebackq। উদাহরণ স্বরূপ.

for /F "usebackq tokens=*" %%A in ("my file.txt") do [process] %%A

37
একটি সামান্য সংযোজন: কমান্ড লাইন থেকে ইন্টারেক্টিভভাবে এই কাজটি করতে, উপরের কমান্ডের %%Aসাথে প্রতিস্থাপন করুন %A। অন্যথায় আপনি পাবেন %%A was unexpected at this time.
ভাদ্পিপ

16
এফওয়াইআই, আপনার যদি "মাল্টি-লাইন কমান্ড করার দরকার হয়," ডিও "এর পরে আপনি একটি খোলা বন্ধনী" ("এবং কয়েকটি লাইন পরে রাখতে পারেন, তবে এটি একটি নিকট বন্ধনী") দিয়ে শেষ করুন "- এবং আপনি কেবল নিজের কোডটি রাখতে পারেন তাদের ভিতরে ব্লক (আপনার স্বাদে অভিযুক্ত)।
BrainSlugs83

3
যে প্যাটার্ন জন্য ধন্যবাদ। আমি দেখেছি যে আমি উদ্ধৃতি ( ") একটি ফাইলের নাম প্রায় দূরে থাকতে পারে না -। শূণ্যস্থান সাহায্যে ফাইল নামের জন্য শুধু আমাকে ফাইলের নাম দেয় যেমন for /F "tokens=*" %%A in ("myfile.txt") do echo A = %%A-> A = myfile.txtকিভাবে এই ব্যর্থ করার কোন ধারনা।?
হবে

1
আপনার কাজ করা ফাইলটি এএনএসআই বা ইউটিএফ 8 এ এনকোডড রয়েছে তা নিশ্চিত করুন। টিআইপিই কমান্ড ব্যবহার করে ফাইলটি দেখার চেষ্টা না করা পর্যন্ত এটি কেন কাজ করছে না তা নিয়ে আমি আমার মাথা আছড়ে পড়ছিলাম এবং আমার প্রত্যাশা ছিল না output এই মুহুর্তে আমি লক্ষ্য করেছি যে কোনও কারণে ফাইলটি "ইউসিএস -২ বিইও বম" এ এনকোড হয়েছে!
ড্যান স্টিভেনস

1
আপনার লুপের ইনডেক্স প্যারামিটারটি একটি একক অক্ষর হতে হবে তা উল্লেখ করার মতো। সুতরাং উদাহরণস্বরূপ %% আমি ভাল তবে %% সূচক ব্যর্থ হবে।
ভিনসেন্ট

59

উইন্ডোজ কমান্ড লাইন রেফারেন্স থেকে:

মন্তব্য করা রেখাগুলি উপেক্ষা করে কোনও ফাইলকে বিশ্লেষণ করতে টাইপ করুন:

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

এই কমান্ডটি মাইফাইল.টেক্সটে প্রতিটি লাইনকে পার্স করে, সেমিকোলন দিয়ে শুরু হওয়া লাইনগুলি উপেক্ষা করে এবং প্রতিটি লাইন থেকে ফোর বডি পর্যন্ত দ্বিতীয় এবং তৃতীয় টোকনকে অতিক্রম করে (টোকেনগুলি কমা বা স্পেস দ্বারা সীমিত করা হয়)। দ্বিতীয় টোকেন পেতে% i,% তৃতীয় টোকেন পেতে% j এবং বাকী সমস্ত টোকেন পেতে% কে উল্লেখ করার জন্য ফর স্টেটমেন্টের মূল অংশ।

যদি আপনি যে ফাইলের নাম সরবরাহ করেন সেগুলিতে স্পেস থাকে, তবে পাঠ্যের চারপাশে উদ্ধৃতি চিহ্নগুলি ব্যবহার করুন (উদাহরণস্বরূপ, "ফাইলের নাম")। উদ্ধৃতি চিহ্নগুলি ব্যবহার করতে, আপনাকে অবশ্যই ইউজব্যাকিউক ব্যবহার করতে হবে। অন্যথায়, উদ্ধৃতি চিহ্নগুলি পার্স করার জন্য একটি আক্ষরিক স্ট্রিং সংজ্ঞায়িত হিসাবে ব্যাখ্যা করা হয়।

উপায় দ্বারা, আপনি বেশিরভাগ উইন্ডোজ সিস্টেমে কমান্ড-লাইন সহায়তা ফাইলটি এখানে খুঁজে পেতে পারেন:

 "C:\WINDOWS\Help\ntcmds.chm"

8
থেকে নির্মল "উদ্ধৃতি চিহ্ন ব্যবহার করতে, আপনি ব্যবহার করা আবশ্যক usebackq" : for /f "usebackq" %%a in ("Z:\My Path Contains Spaces\xyz\abc.txt")
drzaus

35

একটি ব্যাচ ফাইল আপনি হবে ব্যবহার %%পরিবর্তে %: (টাইপ help for)

for /F "tokens=1,2,3" %%i in (myfile.txt) do call :process %%i %%j %%k
goto thenextstep
:process
set VAR1=%1
set VAR2=%2
set VAR3=%3
COMMANDS TO PROCESS INFORMATION
goto :EOF

এটি কী করে: ফোর কমান্ডের শেষে "ডল কল: প্রক্রিয়া%% i %% j %% কে" মাইফাইল.txt থেকে "প্রক্রিয়া" 'সাব্রোটিন'-এ কমান্ডের জন্য প্রাপ্ত তথ্য পাস করে।

আপনি যখন একটি ব্যাচ প্রোগ্রামে ফর কমান্ড ব্যবহার করছেন, আপনার ভেরিয়েবলগুলির জন্য ডাবল% চিহ্ন ব্যবহার করা দরকার।

নিম্নলিখিত রেখাগুলি কমান্ড থেকে প্রক্রিয়া 'সাব রুটিন' এ সেই পরিবর্তনকগুলি পাস করে এবং আপনাকে এই তথ্যটি প্রক্রিয়া করার অনুমতি দেয়।

set VAR1=%1
 set VAR2=%2
 set VAR3=%3

আমার এই সঠিক সেটআপটির বেশ কয়েকটি উন্নত ব্যবহার রয়েছে যা যদি আরও উদাহরণগুলির প্রয়োজন হয় তবে আমি ভাগ করতে চাই would অবশ্যই আপনার ইওএল বা ডিলিমগুলিতে অবশ্যই যুক্ত করুন।


27

প্রথম "ফর / এফ .." উত্তরটির উন্নতি: আমার যা করা দরকার তা হ'ল মাইলিস্ট.টেক্সট-এ তালিকাভুক্ত প্রতিটি স্ক্রিপ্টের সম্পাদনা করানো, সুতরাং এটি আমার পক্ষে কাজ করেছিল:

for /F "tokens=*" %A in  (MyList.txt) do CALL %A ARG1

- অথবা, আপনি যদি একাধিক লাইনের মাধ্যমে এটি করতে চান:

for /F "tokens=*" %A in  (MuList.txt) do (
ECHO Processing %A....
CALL %A ARG1
)

সম্পাদনা করুন: উপরে বর্ণিত উদাহরণটি কমান্ড-প্রম্পট থেকে ফর লুপ সম্পাদনের জন্য; একটি ব্যাচ-স্ক্রিপ্ট থেকে, অতিরিক্ত% যোগ করা দরকার যা নীচের মত দেখানো হয়েছে:

---START of MyScript.bat---
@echo off
for /F "tokens=*" %%A in  ( MyList.TXT) do  (
   ECHO Processing %%A.... 
   CALL %%A ARG1 
)
@echo on
;---END of MyScript.bat---

21

@ মিঃ ক্রাউসের উত্তরটি শিক্ষণীয়। আরও, আমাকে যোগ করতে দিন যে আপনি যদি ব্যাচ ফাইলের মতো একই ডিরেক্টরিতে অবস্থিত কোনও ফাইল লোড করতে চান তবে ফাইলের নাম% ~ dp0 দিয়ে উপস্থাপন করুন। এখানে একটি উদাহরণ:

cd /d %~dp0
for /F "tokens=*" %%A in (myfile.txt) do [process] %%A

এনবি:: যদি আপনার ফাইলের নাম বা ডিরেক্টরি (উদাহরণস্বরূপ উপরের উদাহরণে myfile.txt) এর একটি স্পেস থাকে (যেমন 'my file.txt' বা 'c: \ প্রোগ্রাম ফাইল'):

for /F "tokens=*" %%A in ('type "my file.txt"') do [process] %%A

প্রোগ্রামটিতে কলিং টাইপ কীওয়ার্ড সহ type, যা একটি পাঠ্য ফাইলের বিষয়বস্তু প্রদর্শন করে। আপনি যদি টাইপ কমান্ড কল করার ওভারহেড ভোগ করতে না চান তবে আপনার ডিরেক্টরিটি পাঠ্য ফাইলের ডিরেক্টরিতে পরিবর্তন করা উচিত। নোট করুন যে স্পেস সহ ফাইলের নামের জন্য এখনও প্রকারের প্রয়োজন।

আমি আশা করি এটা কারো সাহায্যে লাগবে!


ব্যাচ ফাইলটি ডিফল্টরূপে বর্তমান ফোল্ডারে প্রদর্শিত হবে কারণ ফাইলের নামটি উপস্থাপন করার দরকার নেই।
foxidrive

1
@ ফক্সিড্রাইভ: ঠিক আছে, আমি আপনাকে শুনছি। যদিও যত্ন নেওয়া উচিত। উদাহরণস্বরূপ, যদি কোনও ডিরেক্টরি পরিবর্তন করা হয় তবে এটি ব্যাচ ফাইলের মধ্যে থাকা পরিবর্তে সেই ডিরেক্টরিতে সন্ধান করবে The সমাধানটি তখন **cd /d %~dp0**লুপের আগে কল করবে । এটি নিশ্চিত করবে যে আপনি ব্যাচের ফাইলটি যে ডিরেক্টরিটিতে রয়েছেন তাতে কোনও ফাইল উল্লেখ করছেন the পর্যবেক্ষণের জন্য ধন্যবাদ
মারভিন থোবজেন

2
typeথ্যাক্স এবং +1 ওয়াকাকারআউন্ডের জন্য
21

আমি typeকাজ করার মতো কাজ পেতে পারি না , আমাকে আমার ফাইলের নামটি উদ্ধৃত করতে হয়েছে কারণ এটি একটি পৃথক ডিরেক্টরিতে রয়েছে যেখানে স্পেস রয়েছে (অভিশাপ আপনাকে Program Files)। আমি একটি ত্রুটি The system cannot find the file `type.
পাচ্ছি

1
@ স্ক্রাগার, আপনি কি সঠিক উদ্ধৃতি পেয়েছেন? এটি একটি 'নয় একটি be হওয়া দরকার ` আমার কীবোর্ডে এটি @
ফ্রিংক দ্য ব্রাভ

18

গৃহীত উত্তরটি ভাল তবে দুটি সীমাবদ্ধতা রয়েছে।
এটি খালি লাইন এবং লাইনগুলি দিয়ে শুরু হয়;

যে কোনও সামগ্রীর লাইনগুলি পড়তে আপনার বিলম্বিত প্রসারণ টগলিং টেকনিকের প্রয়োজন।

@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ text.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    echo(!var!
    ENDLOCAL
)

Findstr লাইন নম্বর এবং একটি কোলন দিয়ে প্রতিটি লাইন উপসর্গ করতে ব্যবহৃত হয়, তাই খালি লাইন আর খালি হয় না।

%%aপ্যারামিটারটি অ্যাক্সেস করার সময় বিলম্বিত এক্সপেনশনটি অক্ষম করা দরকার , অন্যথায় বিস্মৃত বিবরণ চিহ্ন !এবং ক্যারেটগুলি^ হারিয়ে যাবে, কারণ তাদের সেই মোডে বিশেষ অর্থ রয়েছে।

তবে লাইনটি থেকে রেখা নম্বরটি সরাতে, বিলম্বিত সম্প্রসারণটি সক্ষম করা দরকার।
set "var=!var:*:=!"প্রথম কোলন পর্যন্ত সমস্ত সরিয়ে দেয় ( delims=:একটি লাইনের শুরুতে সমস্ত কলোন ব্যবহার করে , কেবল ফাইন্ডাস্ট্র থেকে একগুলি ব্যবহার করে না)।
এন্ডলোকাল পরবর্তী লাইনের জন্য আবার বিলম্বিত সম্প্রসারণ অক্ষম করে।

একমাত্র সীমাবদ্ধতাটি এখন 19 8191 এর লাইন দৈর্ঘ্যের সীমা, তবে এটি অতিক্রম করার কোনও উপায় বলে মনে হচ্ছে না।


10 বিজয় setlocalকমান্ডলাইনে অনুমতি দেয় না । আমি যখন সিএমডি-তে কোড চালাই, আমি পাই! ফাঁকা পরিবর্তে কিভাবে ঠিক করবো?
জিম্বা

প্রক্রিয়া করার আগে সর্বাধিক লাইন দৈর্ঘ্যের 8190 টেম্পোর ফাইলগুলিতে বিভক্ত হয়ে লাইন দৈর্ঘ্যের সীমাটি অতিক্রম করা যায়। তারপরে একটি ফাইলে পুনরায় সংযুক্ত করুন।
জিম্বা

14

অথবা, আপনি উদ্ধৃতিতে বিকল্পগুলি বাদ দিতে পারেন:

FOR /F %%i IN (myfile.txt) DO ECHO %%i

1
একে অপরের পরের দুই শতাংশ লক্ষণগুলি %% কমান্ডে (এক ব্যাচের ফাইল নয়) একক শতাংশের চিহ্ন হিসাবে ব্যবহার করা হয়।
পল

9

একটি ফোল্ডারে সমস্ত এসকিউএল স্ক্রিপ্ট কার্যকর করতে আমি এখানে লিখেছি এমন একটি ব্যাট ফাইল:

REM ******************************************************************
REM Runs all *.sql scripts sorted by filename in the current folder.
REM To use integrated auth change -U <user> -P <password> to -E
REM ******************************************************************

dir /B /O:n *.sql > RunSqlScripts.tmp
for /F %%A in (RunSqlScripts.tmp) do osql -S (local) -d DEFAULT_DATABASE_NAME -U USERNAME_GOES_HERE -P PASSWORD_GOES_HERE -i %%A
del RunSqlScripts.tmp


6

স্বীকৃত আনসার cmd.exeএবং ব্যবহার করে

for /F "tokens=*" %F in (file.txt) do whatever "%F" ...

শুধুমাত্র "সাধারণ" ফাইলগুলির জন্য কাজ করে। এটি বিশাল ফাইলগুলির সাথে খারাপভাবে ব্যর্থ ails

বড় ফাইলগুলির জন্য আপনার পাওয়ারশেল এবং এর মতো কিছু ব্যবহার করতে হতে পারে:

[IO.File]::ReadLines("file.txt") | ForEach-Object { whatever "$_" }

বা আপনার যদি যথেষ্ট স্মৃতি থাকে:

foreach($line in [System.IO.File]::ReadLines("file.txt")) { whatever "$line" } 

এটি আমার পক্ষে ২ মিলিয়ন এমবি ফাইল যুক্ত 250 মিলিয়ন লাইনের সাথে কাজ করেছিল, যেখানে for /F ...কয়েক হাজার লাইনের পরে কমান্ডটি আটকে গিয়েছিল।

মধ্যে পার্থক্য জন্য foreachএবং ForEach-Object, দেখুন জানা foreach এবং foreach-বস্তু পথ

(ক্রেডিট: পাওয়ারশেলের লাইনে ফাইল লাইন পড়ুন )


1

হেরোকুতে আমাদের রেল অ্যাপ্লিকেশনগুলির তালিকা তৈরি করতে এখানে মডেল করা উদাহরণ - ধন্যবাদ!

cmd /C "heroku list > heroku_apps.txt"
find /v "=" heroku_apps.txt | find /v ".TXT" | findstr /r /v /c:"^$" > heroku_apps_list.txt
for /F "tokens=1" %%i in (heroku_apps_list.txt) do heroku run bundle show rails --app %%i

এখানে সম্পূর্ণ কোড ।


প্রতি উপরে অপর এক প্রশ্নের মন্তব্য আপনার কাছে সেই ফাইলে সৃষ্টি / এড়িয়ে যেতে পারেন পড়া এবং মাত্র ব্যবহার - for /f "tokens=1" %%i in ('find /v "=" heroku_apps.txt ^| find /v ".TXT" ^| findstr /r /v /c:"^$"') do...(উল্লেখ্য যোগে ^'পাইপ অব্যাহতি ব্যবহৃত র, যাতে এটি পাস করা হয়েছে forএবং কমান্ড প্রসেসর সরাসরি নয়)
user66001

0

কমান্ড লাইন থেকে টেক্সট ফাইলে সমস্ত লাইন মুদ্রণ করতে (বিলম্বিত এক্সপেনশন সহ):

set input="path/to/file.txt"

for /f "tokens=* delims=[" %i in ('type "%input%" ^| find /v /n ""') do (
set a=%i
set a=!a:*]=]!
echo:!a:~1!)

নেতৃস্থানীয় হোয়াইটস্পেস, ফাঁকা লাইন, হোয়াইটস্পেস লাইনের সাথে কাজ করে।

উইন 10 সিএমডি পরীক্ষিত



দ্বিতীয়টিটি হ'ল ফাঁকা লাইনগুলি মুছে ফেলার জন্য। 1 ম delimsপাঠ্য ফাইলে কোনও লাইন ]যেমন দিয়ে শুরু হয় তা সংশোধন করতে পারে । এমন কিছু চরিত্রের সাথে প্রতিস্থাপন করুন যা না, বা ব্যাকস্পেস বা বেলের মতো নিয়ন্ত্রণের অক্ষর; এগুলি সাধারণত পাঠ্য ফাইলগুলিতে পাওয়া যায় না। এর কারণ delims=]হ'ল ফাঁকা রেখাগুলি সংরক্ষণের /nজন্য findকমান্ড দ্বারা নির্মিত স্থানধারীদের অপসারণ করা ।
জিম্বা

@ জেব: বন্ধনী]]] সমস্যা সমাধান হয়েছে। পাঠ্য ফাইলে সমস্ত লাইন মুদ্রণের জন্য আপডেট দেখুন। উইন 10 সিএমডি-তেও কাজ করে।
জিম্বা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.