كيف يمكنك تكرار كل سطر في ملف نصي باستخدام ملف دفعي يعمل بنظام Windows؟

StackOverflow https://stackoverflow.com/questions/155932

  •  03-07-2019
  •  | 
  •  

سؤال

أرغب في معرفة كيفية تكرار كل سطر في ملف نصي باستخدام ملف دفعي يعمل بنظام Windows ومعالجة كل سطر من النص على التوالي.

هل كانت مفيدة؟

المحلول

وظائف أدناه ساعدت إلى حد كبير، لكنها لم تفعل ما ذكرت في السؤال الخاص بي حيث كنت في حاجة لمعالجة خط كامل ككل. هنا هو ما وجدته في العمل.

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

والكلمة الرموز بعلامة النجمة (*) ستسحب كل نص للخط بأكمله. إذا كنت لا تضع في النجمة انها ستسحب فقط الكلمة الأولى على خط المرمى. أفترض أنه لا علاقة له مع مسافات.

للقيادة على TechNet

وأنا أقدر كل من الوظائف!


وإذا كان هناك مسافات في مسار الملف الخاص بك، فإنك بحاجة إلى استخدام usebackq. على سبيل المثال.

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

نصائح أخرى

ومن الإشارة سطر الأوامر ويندوز:

لتحليل ملف، وتجاهل أسطر التعليقات، اكتب:

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

وهذا الأمر بتوزيع كل سطر في على Myfile.txt، وتجاهل الأسطر التي تبدأ بفاصلة منقوطة وتمرير الرمز المميز الثاني والثالث من كل سطر إلى FOR الجسم (وفواصل الرموز بفواصل أو مسافات). جسم FOR المراجع بيان٪ ط للحصول على رمز الثاني،٪ ي في الحصول على الرمز الثالث، و٪ ك للحصول على كل الرموز المتبقية.

إذا أسماء الملفات التي توفرها تحتوي على مسافات، استخدم علامات الاقتباس حول النص (على سبيل المثال، "اسم الملف"). استخدام علامات الاقتباس، يجب عليك استخدام usebackq. خلاف ذلك، يتم تفسير علامات الاقتباس كما تحديد سلسلة حرفية تحليل.

وبالمناسبة، يمكنك العثور على ملف تعليمات سطر الأوامر على معظم أنظمة ويندوز على العنوان التالي:

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

في ملف دفعة لك على MUST استخدام %% بدلا من %: (نوع 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

وهذا ما يفعله: و"أدعو: عملية ٪٪ ٪٪ ط ي ك ٪٪". في نهاية للقيادة بتمرير المعلومات المكتسبة في للقيادة من على Myfile.txt إلى "عملية" 'روتين'

عند كنت تستخدم للقيادة في برنامج دفعة، تحتاج إلى استخدام علامات مزدوجة٪ للمتغيرات.

والأسطر التالية تمر هذه المتغيرات من أجل الأمر إلى عملية "شبه روتينية 'وتسمح لك لمعالجة هذه المعلومات.

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

ولدي بعض الاستخدامات المتقدمة جدا من هذا الإعداد الدقيق الذي سأكون على استعداد لتقاسم إذا كانت هناك حاجة أمثلة أخرى. إضافة في موسوعة الحياة أو Delims حسب الحاجة بطبيعة الحال.

وتحسين أولا "FOR / F .." الجواب: ما كان علي القيام به هو استدعاء تنفيذ كل النصي المدرجة في MyList.txt، وذلك لأنها عملت لي:

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

- OR، إذا كنت ترغب في القيام بذلك عبر خط متعددة:

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

وتحرير: المثال المذكور أعلاه هو لتنفيذ FOR حلقة من الأوامر موجه. من النصي دفعة، يحتاج إلى إضافته، كما هو مبين أدناه٪ إضافية:

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

@السيد كراوس إجابة هو مفيد.وعلاوة على ذلك، اسمحوا لي أن أضيف ذلك إذا كنت تريد تحميل ملف موجود في نفس الدليل كملف دفعي، ضع بادئة اسم الملف بـ %~dp0.هنا مثال:

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

ملحوظة::إذا كان اسم ملفك أو دليلك (على سبيل المثال.myfile.txt في المثال أعلاه) يحتوي على مسافة (على سبيل المثال"ملفي.txt" أو "ملفات c:\Program")، استخدم:

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

, ، مع ال يكتب الكلمة الرئيسية التي تدعو type برنامج يعرض محتويات الملف النصي.إذا كنت لا تريد أن تتحمل عبء استدعاء أمر الكتابة، فيجب عليك تغيير الدليل إلى دليل الملف النصي.لاحظ أن النوع لا يزال مطلوبًا لأسماء الملفات التي تحتوي على مسافات.

آمل أن يساعد هذا شخص ما!

والجواب المقبول جيدة، ولكن اثنين من القيود.
فإنه يسقط خطوط وخطوط فارغة بدءا ;

لقراءة خطوط من أي مضمون، كنت في حاجة إلى تأخر تقني التوسع تبديل.

@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، آخر التعجب علامات ! وCARETS ^ سوف تضيع، لأنها لها معان خاصة في هذا الوضع DelayedExpansion.

ولكن لإزالة رقم السطر من الخط، ويحتاج التوسع تأخر إلى تمكين.
set "var=!var:*:=!" يزيل كل ما يصل إلى القولون الأول (باستخدام delims=: ستزيل أيضا عن نقطتين في بداية السطر، وليس فقط واحدة من FINDSTR).
وENDLOCAL تعطيل التوسع تأخر مرة أخرى للخط المقبل.

والقيد الوحيد هو الآن الحد طول خط ~ 8191، ولكن يبدو أن هناك أي وسيلة للتغلب على هذا.

وأو قد استبعاد الخيارات في الاقتباس:

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

وهنا ملف الخفافيش كتبت لتنفيذ جميع البرامج النصية SQL في مجلد:

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

إذا كان لديك NT-عائلة Windows (واحد مع cmd.exe كما قذيفة)، في محاولة وFOR / F قيادة .

ووanwser تقبل باستخدام cmd.exe و

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

ويعمل فقط لملفات "طبيعية". أنه فشل فشلا ذريعا مع ملفات ضخمة.

لملفات كبيرة، قد تحتاج إلى استخدام بوويرشيل وشيء من هذا القبيل:

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

وأو إذا كان لديك ما يكفي من الذاكرة:

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

وهذا عمل بالنسبة لي مع ملف 250 MB تحتوي على أكثر من 2 مليون خط، حيث حصلت على الأمر for /F ... عالقة بعد بضعة آلاف من الخطوط.

لالخلافات بين foreach وForEach-Object، انظر> وأ href = "https://blogs.technet.microsoft.com/heyscriptingguy/2014/07/08/getting-to-know-foreach-and-foreach-object / "يختلط =" نوفولو noreferrer "> التعرف على ForEach وForEach-كائن .

و(ائتمانات: قراءة خط ملف سطرا في بوويرشيل )

والأمثلة كتكوت هنا لدينا قائمة القضبان تطبيقات على Heroku - بفضل

!
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

هنا .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top