উইন্ডোজ ব্যাচ কমান্ড (গুলি) পাঠ্য ফাইল থেকে প্রথম লাইন পড়তে


85

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


4
GNU32 "হেড" ইউটিলিটি চেষ্টা করুন। ভাববেন না যে আপনি যা করছেন তা কেবল ডস ব্যাচ দ্বারা সহজেই সম্পাদিত হবে।
নাসির

@ নাসির, এটি কি ইনবিল্ট কমান্ড দিয়ে করা যায় না?
প্রজওয়াল ধাওয়ালিয়া

উত্তর:


48

nGNU headইউটিলিটির মতো কোনও ফাইলের উপরের লাইনগুলি কেবল একটি একক লাইনের পরিবর্তে মুদ্রণের জন্য এখানে একটি সাধারণ-উদ্দেশ্য ব্যাচের ফাইল রয়েছে ।

@echo off

if [%1] == [] goto usage
if [%2] == [] goto usage

call :print_head %1 %2
goto :eof

REM
REM print_head
REM Prints the first non-blank %1 lines in the file %2.
REM
:print_head
setlocal EnableDelayedExpansion
set /a counter=0

for /f ^"usebackq^ eol^=^

^ delims^=^" %%a in (%2) do (
        if "!counter!"=="%1" goto :eof
        echo %%a
        set /a counter+=1
)

goto :eof

:usage
echo Usage: head.bat COUNT FILENAME

উদাহরণ স্বরূপ:

Z:\>head 1 "test file.c"
; this is line 1

Z:\>head 3 "test file.c"
; this is line 1
    this is line 2
line 3 right here

এটি বর্তমানে ফাঁকা রেখা গণনা করে না। এটি 8 কেবি ব্যাচ-ফাইলের লাইন-দৈর্ঘ্যের সীমাবদ্ধতার সাপেক্ষে।


11
এফওয়াইআই: "গোটো: ইওএফ" এটি একটি বিশেষ লেবেল যা কোনও বিশেষ ": প্রস্থান" লেবেল সংজ্ঞায়িত না করে স্ক্রিপ্ট থেকে প্রস্থান করবে। ব্যাচে সাবরুটাইনগুলি সংজ্ঞায়িত করার সময় এটিও দরকারী (আপনি কী বলছেন? সাব্রোটাইন? হ্যাঁ)
স্টিভেন

4
এটি আমার বেশ কয়েকটি জিবি টেক্সট ফাইলগুলিতে বোমা ফাটিয়েছে বলে মনে হচ্ছে ... 10 টি লাইন ফেরত দেওয়ার চেষ্টা করার সময় একটি ফাইলে এটি আমাকে "আউট অফ মেমোরি" ত্রুটি দেয়, অন্য ফাইলটিতে ফিরে আসতে বলার সময় এটি একটি ফাঁকা লাইনই ফিরিয়ে দেয় 10 লাইন। কোনও ধারণা কেন এমন হয়?
ড্যান

4
@ ড্যান - লাইনগুলি কত দিন? ফর / এফ 8191 বাইটের চেয়ে দীর্ঘ লাইনগুলিকে "উপেক্ষা করে"। তবে আমি অবাক হয়েছি যে "আউট অফ মেমোরি" ত্রুটি যদি সত্যিই দীর্ঘ লাইনের মুখোমুখি হয় তবে উত্থিত হয়।
dbenham

@ স্টেফেনমুলার - উপরের ড্যানের প্রতি আমার মন্তব্য দেখুন
dbenham

লিখিত হিসাবে, এই উত্তর খালি লাইন উপেক্ষা করবে। এটি সেমিকোলন দিয়ে শুরু হওয়া লাইনগুলিও অগ্রাহ্য করবে ;, ফর / এফ ইওএল অক্ষর character যদি 10 টি লাইনের জন্য জিজ্ঞাসা করা হয়, তবে এটি প্রথম 10 টি লাইন মুদ্রণ করবে যা খালি নয় এবং শুরু হয় না ;
dbenham 4'12

225

আহ? ইমো এটি অনেক সহজ

  set /p texte=< file.txt  
  echo %texte%

16
+1, এটি কাজ করার সময় এটি সেরা :-) এর সীমাবদ্ধতা রয়েছে 1) EOL সহ নয় 1021 বাইটের সর্বাধিক লাইনের দৈর্ঘ্য। 2) ফাইলটি অবশ্যই ক্যারেজ রিটার্ন লাইনফিডের উইন্ডোজ স্টাইলের EOL ব্যবহার করবে। 3) ট্রেলিং নিয়ন্ত্রণের অক্ষরগুলি লাইন থেকে ছিনিয়ে নেওয়া হবে
dbenham

4
এছাড়াও, 1 ম লাইন ফাঁকা থাকলে কেবল ফাইলটি পড়ার আগে টেক্সট স্পষ্টভাবে অপরিজ্ঞাত হওয়া উচিত।
dbenham

স্ট্রিংটি ছাঁটাই করার জন্য এখানে কিছু অতিরিক্ত টিপস দেওয়া হয়েছে। echo %texte:~3%উদাহরণস্বরূপ প্রথম তিনটি অক্ষর এড়ানো হবে। এটি কার্যকরভাবে যখন আপনি বিওএম সহ কোনও ইউটিএফ -8 ফাইল পড়ছেন।
কার্গওয়্যার

22

ওহে ছেলেরা ...

C:\>findstr /n . c:\boot.ini | findstr ^1:

1:[boot loader]

C:\>findstr /n . c:\boot.ini | findstr ^3:

3:default=multi(0)disk(0)rdisk(0)partition(1)\WINNT

C:\>

4
ফাইলটিতে যদি 11 টিরও বেশি লাইন থাকে তবে এটি প্রথমটির চেয়ে বেশি মুদ্রণ করবে, যেমন: 1 :, 11 :, 21 :, ইত্যাদি ...
সিজার রোমেরো

4
ভাল সিজার! আমি সর্বদা উদ্ধৃতিগুলি এড়াতে চেষ্টা করি কারণ তারা আমাকে বিরক্ত করে, তবে এই ক্ষেত্রে এটি একটি খারাপ ধারণা ছিল। ঠিক করতে, পরিবর্তন করুন findstr "^1:"এবং ডাবল কোটের উষ্ণতা এবং সুরক্ষা অর্জন করুন। অথবা, আপনি যদি আমার মতো উক্তিগুলি অবজ্ঞা করেন এবং বিপজ্জনকভাবে বাঁচতে চান, ব্যবহার করুনfindstr /b 1:
অমিত নাইডু

4
যদি আপনি এটি উদ্ধৃতি চিহ্ন বিনা এবং / খ বিকল্প ছাড়া চান তারপর ক্যারেট অব্যাহতি: findstr ^^1
dbenham

দুর্দান্ত ইঙ্গিত, ডেনহ্যাম, সেন্টিমিডিতে পালিয়ে যাওয়া আমাকে সর্বদা পালিয়ে যায়। যাইহোক, দয়া করে বড় ফাইলগুলির জন্য এই পদ্ধতিটি ব্যবহার করবেন না, এটি আসলে পুরো ফাইলটি পড়ে এবং খুব অযোগ্য। এই সমাধানের জন্য আমার একমাত্র মানদণ্ড ছিল ক) এটি একটি একক লাইন হওয়া উচিত খ) স্মৃতি থেকে টাইপ করে মনে রাখা বা পুনরায় তৈরি করা সহজ হওয়া উচিত, কপি-পেস্ট সি নয়) কোনও বাহ্যিক সরঞ্জাম নেই। set /pসমাধান অনেক বেশি বড় ফাইল জন্য কার্যকরী।
অমিত নাইডু

4
এছাড়াও, এটি আপনি যে পাঠ্যটি চান সত্যিই চান সেই লাইনের নম্বরটিকে প্রাইন্ডেন্ড করে! অতএব এতটা কার্যকর নয় যখন আপনার কেবল পাঠ্যের প্রয়োজন।
রস প্রেসার 12'15

11

আপনি এটি ব্যবহার করে দেখতে পারেন:

@echo off

for /f %%a in (sample.txt) do (
  echo %%a
  exit /b
)

সম্পাদনা করুন বা বলুন যে আপনার কাছে চারটি ডেটা কলাম রয়েছে এবং 5 তম সারি থেকে নীচে পর্যন্ত চান, এটি চেষ্টা করুন:

@echo off

for /f "skip=4 tokens=1-4" %%a in (junkl.txt) do (
  echo %%a %%b %%c %%d
)

4
এটি আমার প্রয়োজনীয় ক্লুটি দিয়েছে তবে এটি ঠিক ছিল না। সঠিক পদ্ধতিটি কী তা নিশ্চিত নয় তবে আমি এই সমাধানটি চূড়ান্ত সমাধানে অন্তর্ভুক্ত করেছি। স্ট্যাকওভারফ্লো
জেসি ভোগ

4
এই সমাধানটির সমস্যাটি হ'ল এটি নিউলাইনটির পরিবর্তে স্পেসে ডিলিট করে এবং স্পেস সহ আপনার কোনও ফাইলের নাম থাকতে পারে না। লুপের জন্য ডিলিম এবং ইউজব্যাকের বিকল্পগুলির সাহায্যে আপনি এই সমস্যাগুলি সমাধান করতে পারেন।
indiv

আমার জন্য কাজ করে, তবে "delims="ফাঁকা জায়গাগুলির সাথে পুরো ফোল্ডারের নামগুলি মুদ্রণের জন্য আমাকে যুক্ত করতে হয়েছিল।
জিচুফ


4

সামান্যভাবে অন্য লোকদের জবাব উপর ভিত্তি করে। এখন আপনি যে ফাইলটি পড়তে চান এবং যে ভেরিয়েবলটি আপনি ফলাফলের মধ্যে রাখতে চান তা সুনির্দিষ্ট করার অনুমতি দেয়:

@echo off
for /f "delims=" %%x in (%2) do (
set %1=%%x
exit /b
)

এর অর্থ আপনি উপরেরটি এটির মতো ব্যবহার করতে পারেন (ধরে নিলেন আপনি এটি getline.bat বলেছিলেন)

c:\> dir > test-file
c:\> getline variable test-file
c:\> set variable  
variable= Volume in drive C has no label.

3

স্ট্যান্ডআউট ">" এর সাথে পুনঃনির্দেশের জন্য দরকারী একটি লাইনার:

@for /f %%i in ('type yourfile.txt') do @echo %%i & exit

2

এটা চেষ্টা কর

@echo off
setlocal enableextensions enabledelayedexpansion
set firstLine=1
for /f "delims=" %%i in (yourfilename.txt) do (
    if !firstLine!==1 echo %%i
    set firstLine=0
)
endlocal

2

একটি ফাইল cicle করার জন্য ( file1.txt, file1[1].txt, file1[2].txt, ইত্যাদি):

START/WAIT C:\LAERCIO\DELPHI\CICLADOR\dprCiclador.exe C:\LAERCIUM\Ciclavel.txt

rem set/p ciclo=< C:\LAERCIUM\Ciclavel.txt:
set/p ciclo=< C:\LAERCIUM\Ciclavel.txt

rem echo %ciclo%:
echo %ciclo%

এবং এটি চলছে।


এর ব্যাখ্যাটি হল: set /pএকটি প্রম্পটের মাধ্যমে জিজ্ঞাসা; তবে ফাইল পুনর্নির্দেশের সাথে সাথে <সাথেই তাৎক্ষণিকভাবে ফাইলের বিষয়বস্তু পাওয়া যায়; এবং প্রথম লাইনটি শেষ হওয়ার সাথে সাথে একটি লাইনের সমাপ্তি হয়, সেই মুহূর্তে প্রম্পট পড়া বন্ধ করে দেয় এবং এভাবে ভেরিয়েবলের মধ্যে প্রথম লাইনটি সংরক্ষণ করে।
sdbbs

1

EXIT /Bসমাধানগুলির সাথে সমস্যাটি , যখন আরও ব্যাচ ফাইলের অভ্যন্তরে আরও বাস্তবের দিক থেকে এটির কেবল এক অংশ হিসাবে নিম্নলিখিত is এর পরে উল্লিখিত ব্যাচ ফাইলের মধ্যে পরবর্তী কোনও প্রক্রিয়াজাতকরণ নেই EXIT /B। সাধারণত ব্যাচগুলিতে কেবলমাত্র এক, সীমিত কাজ ছাড়াও আরও অনেক কিছু থাকে।

এই সমস্যাটি মোকাবেলায়:

@echo off & setlocal enableextensions enabledelayedexpansion
set myfile_=C:\_D\TEST\My test file.txt
set FirstLine=
for /f "delims=" %%i in ('type "%myfile_%"') do (
  if not defined FirstLine set FirstLine=%%i)
echo FirstLine=%FirstLine%
endlocal & goto :EOF

(তবে তথাকথিত বিষের চরিত্রগুলি এখনও সমস্যা হবে।)

ব্যাচের কমান্ডগুলির সাথে একটি নির্দিষ্ট লাইন পাওয়ার বিষয়ে আরও:

আমি কীভাবে কোনও পাঠ্য ফাইলের প্রথম ও শেষ লাইনটি পেতে পারি? " Http://www.netikka.net/tsneti/info/tscmd023.htm

[২৮-আগস্ট -২০১২ যোগ করেছেন] একজনের মধ্যে এটিও থাকতে পারে:

@echo off & setlocal enableextensions
set myfile_=C:\_D\TEST\My test file.txt
for /f "tokens=* delims=" %%a in (
  'type "%myfile_%"') do (
    set FirstLine=%%a& goto _ExitForLoop)
:_ExitForLoop
echo FirstLine=%FirstLine%
endlocal & goto :EOF

সেট / প টেক্সট = <file.txt সম্ভবত নিফটিস্ট সলিউশন যা উপস্থাপিত হয়েছে। @ স্পেসবলস দ্বারা এই থ্রেডে। সাধারণভাবে, আমি সেট / পি "টেক্সট" = <"file.txt" লিখতাম তবে এটি বিন্দুর পাশে beside নোট করুন যে এমনকি এই দ্রবণটি বিষ চরিত্রগত সমস্যাগুলির ঝুঁকিতে রয়েছে, অর্থাত্ ফাইল.টিএসটিএসটিতে কী রয়েছে তার উপর নির্ভর করে ব্যর্থ হতে পারে।
টিমো সালমি

0

দ্রষ্টব্য, ব্যাচ ফাইলের পন্থাগুলি ডস কমান্ড প্রসেসরের লাইন সীমাতে সীমাবদ্ধ থাকবে - দেখুন কমান্ড লাইনের দৈর্ঘ্য সীমাটি কী?

সুতরাং যদি এমন কোনও ফাইলের প্রক্রিয়া করার চেষ্টা করা হয় যা 8192 টির বেশি অক্ষরের বেশি থাকে তবে স্ক্রিপ্টটি কেবল এটিকে এড়িয়ে যায় কারণ মানটি ধরে রাখা যায় না।


0

অন্য উপায়

setlocal enabledelayedexpansion
@echo off
for /f "delims=" %%i in (filename.txt) do (
if 1==1 (
set first_line=%%i
echo !first_line!
goto :eof
))

4
আমি কেবল একটি শেষ উপায় হিসাবে একটি .bat ফাইল ব্যবহার করার পরামর্শ দেব। যদি এটি সম্ভব হয় তবে সর্বদা একটি "আসল" স্ক্রিপ্টিং ভাষা ব্যবহার করার চেষ্টা করুন: পাওয়ারশেল, ডাব্লুএসএইচ, পাইথন ... অন্য কোনও ফাইল .bat ফাইলগুলি।
পলস্ম 4

4
ব্যাচ নয় যে খারাপ (যখন আপনি কি জানেন, তোমরা যা কর; প্রত্যেক অন্যান্য ভাষা সঙ্গে হিসাবে একই)। হাই: আপনার কোডটি কাজ করছে না।
স্টিফান


4
@ পলস্ম ৪: ব্যাচের ফাইলগুলিতে কী হয়েছে? এটি উইন্ডোজের সমস্ত স্বাদে কাজ করে এবং তত্ক্ষণাত্ তৃতীয় পক্ষের সফ্টওয়্যার ইনস্টল না করে যাদুঘটি ঘটতে দেয়, যার ফলে যতক্ষণ আপনি এটি বুঝতে পারবেন ততক্ষণ তৃতীয় পক্ষের সফটওয়্যারটি যাদুঘটিত হতে দেয় allowing আপনি কি জানেন যে পাওয়ারশেল এবং ডটনেটের অনেক আগে আপনি ডস এবং ব্যাচ ফাইলগুলির সাথে টিসিপি / আইপি করতে পারবেন?
জিম্বা

0

এখানে ব্যবহার করে একটি কার্যনির্বাহী powershell:

powershell (Get-Content file.txt)[0]

(আপনি সহজেই এর সাথে বিভিন্ন লাইনের রেখাও পড়তে পারেন powershell (Get-Content file.txt)[0..3])

আপনার প্রথম লাইন হিসাবে ব্যাচ স্ক্রিপ্টের ভিতরে যদি কোনও ভেরিয়েবল সেট file.txtকরতে হয় তবে:

for /f "usebackq delims=" %%a in (`powershell ^(Get-Content file.txt^)[0]`) do (set "head=%%a")


-1

for /f "delims=" %a in (downing.txt) do echo %a & pause>nul

1 ম লাইন মুদ্রণ করে, তারপরে পরবর্তী লাইনে মুদ্রণের জন্য ব্যবহারকারী কী টিপতে অপেক্ষা করে। প্রয়োজনীয় লাইনগুলি মুদ্রণের পরে, থামতে Ctrl + C টিপুন।

@ রোস প্রেসার: এই পদ্ধতিটি কেবল লাইনগুলি প্রিন্ট করে, লাইন সংখ্যাগুলি প্রিপেন্ড করে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.