Windows toplu iş dosyasını kullanarak bir metin dosyasındaki her satırda nasıl döngü yaparsınız?


244

Nasıl bir Windows toplu iş dosyası kullanarak bir metin dosyasında her satır arasında döngü ve art arda her metin satırını işlemek istiyorum.

Yanıtlar:


305

Aşağıdaki gönderiler çok yardımcı oldu, ancak sorumun tamamında tüm çizgiyi bir bütün olarak işlemek için ihtiyaç duyduğum şeyi yapmadım. İşte bulduğum şey.

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

Yıldız işareti (*) içeren tokens anahtar sözcüğü tüm satır için tüm metni çeker. Yıldız işaretini koymazsanız, yalnızca satırdaki ilk sözcüğü alır. Sanırım boşluklarla ilgisi var.

TechNet'te Komut İçin

Tüm gönderileri takdir ediyorum!


Dosya yolunuzda boşluklar varsa kullanmanız gerekir usebackq. Örneğin.

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

37
Küçük bir ekleme: Bu işlemi komut satırından etkileşimli %%Aolarak %Ayapmak için yukarıdaki komutta değiştirin. Aksi takdirde alacaksınız %%A was unexpected at this time..
vadipp

17
FYI, çok satırlı bir komut yapmanız gerekiyorsa, "DO" dan sonra açık bir parantez "(" ve birkaç satır sonra onu bir parantez ile bitirin ")" - ve kodunuzu koyabilirsiniz engelleyin (zevkinize göre girintili).
BrainSlugs83

3
Bu desen için teşekkürler. Ben bir dosya adı etrafında tırnak (") koyamadık bulduk - Boşluklu dosya adları için bana sadece dosya adını verir. Eg for /F "tokens=*" %%A in ("myfile.txt") do echo A = %%A-> A = myfile.txt. Bunu önlemek için herhangi bir fikir?
olacak

1
Çalıştığınız dosyanın ANSI veya UTF8 olarak kodlandığından emin olun. TYPE komutunu kullanarak dosyayı görüntülemeye çalıştığımdan ve neden beklediğimden çıkmayana kadar bunun neden işe yaramadığı konusunda başımı kaşıyordum. Bu noktada dosyanın "UCS-2 BE BOM" içinde kodlanmış olduğunu fark ettim!
Dan Stevens

1
Döngünüzdeki dizin parametresinin tek bir karakter olması gerektiğini belirtmek gerekir. Yani örneğin %% i gayet iyi ancak %% endeksi başarısız olacak.
Vincent

59

Windows komut satırı başvurusundan:

Bir dosyayı ayrıştırmak ve yorum yapılan satırları yok saymak için şunu yazın:

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

Bu komut, noktalı virgülle başlayan ve ikinci ve üçüncü belirteci her satırdan FOR gövdesine geçiren satırları yok sayarak Myfile.txt dosyasındaki her satırı ayrıştırır (belirteçler virgül veya boşlukla sınırlanır). FOR deyiminin gövdesi, ikinci belirteci almak için% i, üçüncü belirteci almak için% j ve kalan belirteçlerin tümünü almak için% k değerini belirtir.

Sağladığınız dosya adları boşluk içeriyorsa, metnin çevresinde tırnak işaretleri kullanın (örneğin, "Dosya Adı"). Tırnak işaretlerini kullanmak için usebackq komutunu kullanmalısınız. Aksi takdirde, tırnak işaretleri ayrıştırılacak gerçek bir dizeyi tanımlamak olarak yorumlanır.

Bu arada, komut satırı yardım dosyasını çoğu Windows sisteminde şu adreste bulabilirsiniz:

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

8
için açıklık "tırnak işaretlerini kullanmaya, kullanmak gerekir usebackq" : for /f "usebackq" %%a in ("Z:\My Path Contains Spaces\xyz\abc.txt")
drzaus

35

Bir toplu iş dosyası size GEREKİR kullanmak %%yerine %: (Tür 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

Bu ne işe yarar: for komutunun sonundaki "do call: process %% i %% j %% k", myfile.txt dosyasından for komutunda edinilen bilgileri "process" 'alt yordamına' geçirir.

Bir toplu iş programında for komutunu kullanırken, değişkenler için% çift işaret kullanmanız gerekir.

Aşağıdaki satırlar bu değişkenleri for komutundan 'alt yordam' işlemine geçirir ve bu bilgileri işlemenizi sağlar.

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

Daha fazla örnek gerekirse paylaşmak isteyeceğim bu tam kurulum bazı oldukça gelişmiş kullanımları var. Elbette gerektiği gibi EOL veya Delims'e ekleyin.


27

İlk "FOR / F .." cevabını geliştirmek: Yapmak zorunda olduğum şey MyList.txt içinde listelenen her script'i yürütmek demekti, bu yüzden benim için çalıştı:

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

--VEYA, birden çok satır üzerinden yapmak istiyorsanız:

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

Düzenleme: Yukarıda verilen örnek komut isteminden FOR döngü yürütmek içindir; bir toplu komut dosyasından aşağıda gösterildiği gibi fazladan bir% eklenmelidir:

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

@ MrKraus'un cevabı öğreticidir. Ayrıca, toplu iş dosyasıyla aynı dizinde bulunan bir dosyayı yüklemek istiyorsanız , dosya adının önüne% ~ dp0 ekleyin. İşte bir örnek:

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

Not:: Dosya adınız veya dizininiz (örn. Yukarıdaki örnekteki myfile.txt dosyası) bir alana sahipse (örn. 'Dosya.txt' veya 'c: \ Program Dosyaları') şunu kullanın:

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

, bir metin dosyasının içeriğini görüntüleyen, programı çağıran type anahtar sözcüğüyle type. Type komutunu çağırmanın ek yüküne maruz kalmak istemiyorsanız, dizini metin dosyasının dizinine değiştirmelisiniz. Boşluğa sahip dosya adları için türün hala gerekli olduğunu unutmayın.

Umarım bu birine yardımcı olur!


Toplu iş dosyası varsayılan olarak geçerli klasörde görüneceğinden, dosya adının ön ekine gerek yoktur.
foxidrive

1
@foxidrive: Tamam, seni duyuyorum. Her ne kadar özen gösterilmelidir. Örneğin, bir dizin değiştirildiyse, toplu iş dosyasının içerdiği dizin yerine bu dizine bakar. Çözüm **cd /d %~dp0**, for döngüsünden önce çağırılır. Bu, toplu iş dosyasının bulunduğu dizindeki bir dosyaya başvurduğunuzdan emin olmanızı sağlar. Gözleminiz için teşekkürler
Marvin Thobejane

2
Thx ve 1 typeWalkaround
halex

Ben alamıyorum type, bunu boşlukları (sizi Damn içeren farklı bir dizinde çünkü benim dosya alıntı yaşadım çalışan etrafında çalışmalarını Program Files). Bir hata alıyorumThe system cannot find the file `type.
scragar

1
@scragar, doğru teklifi aldın mı? bunun bir 'değil' olması gerekir.
Klavyemde

18

Kabul edilen cevap iyidir, ancak iki sınırlaması vardır.
Boş satırları ve ile başlayan satırları;

Herhangi bir içeriğin satırlarını okumak için, gecikmeli genişletme geçiş tekniğine ihtiyacınız vardır.

@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, her satıra satır numarası ve iki nokta üst üste işareti eklemek için kullanılır, bu nedenle boş satırlar artık boş olmaz.

Gecikmeli Genişletme %%aparametresine erişilirken devre dışı bırakılmalıdır, bu modda özel anlamları olduğu için ünlem işaretleri !ve işaretler ^kaybolacaktır.

Ancak satır numarasını satırdan kaldırmak için, gecikmeli genişletmenin etkinleştirilmesi gerekir.
set "var=!var:*:=!"ilk iki nokta üst üste kadar tümünü kaldırır (kullanarak delims=:, yalnızca findstr'den değil, bir satırın başındaki tüm iki nokta üst üste işaretleri de kaldırılır).
Endlocal, bir sonraki satır için gecikmeli genişletmeyi tekrar devre dışı bırakır.

Tek sınırlama şimdi ~ 8191 satır uzunluğu sınırıdır, ancak bunun üstesinden gelmenin bir yolu yoktur.


Win 10 setlocalkomut satırına izin vermiyor . CMD'de kod çalıştırdığımda, var! boşluklar yerine. Nasıl düzeltilir?
Zimba

işlemeden önce dosya maksimum hat uzunluğu 8190 olan geçici dosyalara bölünerek satır uzunluğu sınırı aşılabilir. Sonra bir dosyaya yeniden birleştirildi.
Zimba

14

Veya seçenekleri tırnak içinde hariç tutabilirsiniz:

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

1
%% yan yana iki yüzde işareti, bir komuttaki tek bir yüzde işareti (toplu iş dosyası değil) olarak değerlendirilir.
Paul

9

İşte bir klasördeki tüm SQL komut dosyalarını yürütmek için yazdığım bir yarasa dosyası:

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

Kullanılarak kabul anwser cmd.exeve

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

yalnızca "normal" dosyalar için çalışır. Büyük dosyalar ile sefil başarısız.

Büyük dosyalar için Powershell ve bunun gibi bir şey kullanmanız gerekebilir:

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

veya yeterli belleğiniz varsa:

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

Bu benim için, for /F ...komutun birkaç bin satırdan sonra sıkıştığı , 2 milyondan fazla satır içeren 250 MB'lık bir dosyayla işe yaradı .

Arasındaki farklar için foreachve ForEach-ObjectGörmekten bilir ForEach ve ForEach-Nesne Ulaşım .

(kredi: PowerShell'de dosyayı satır satır oku )


1

Heroku'daki Rails uygulamalarımızı listelemek için burada modifiye örnekler - teşekkürler!

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

Tam kod burada .


Yukarıdaki başka bir soru için yorum başına - Dosya oluşturma / okuma atlayabilir ve sadece kullanabilirsiniz for /f "tokens=1" %%i in ('find /v "=" heroku_apps.txt ^| find /v ".TXT" ^| findstr /r /v /c:"^$"') do...( doğrudan komut işlemcisine değil ^, borudan kaçmak için ' ekleme ek unutmayın for)
user66001

0

Metin dosyasındaki tüm satırları komut satırından yazdırmak için (delayedExpansion ile):

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

Önde gelen boşluk, boş çizgiler, boşluk satırlarıyla çalışır.

Win 10 CMD'de test edildi


Tanrı deneyin, ancak ilk örneğiniz ]]]satırlardan
çıkmayı

İkincisi boş satırları kaldırmak içindir. Birincisi delims, metin dosyasındaki herhangi bir satır, ]ör. değiştirmeyen bir karakterle veya geri tuşu veya zil gibi bir kontrol karakteriyle değiştirin; normalde metin dosyalarında bulunmazlar. Nedeni delims=]yarattığı tutucuları kaldırmaktır /nait findboş satırlar korumak için komuta.
Zimba

@jeb: bracket]]] sorunu giderildi. Metin dosyasındaki tüm satırları yazdırmak için güncellemeye bakın. Win 10 CMD üzerinde de çalışır.
Zimba
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.