Yanıtlar:
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.
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
for /F "tokens=*" %%A in ("myfile.txt") do echo A = %%A
-> A = myfile.txt
. Bunu önlemek için herhangi bir fikir?
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"
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.
İ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---
@ 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!
**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
type
Walkaround
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.
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 %%a
parametresine 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.
setlocal
komut satırına izin vermiyor . CMD'de kod çalıştırdığımda, var! boşluklar yerine. Nasıl düzeltilir?
İş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
NT ailesi Windows'unuz varsa ( cmd.exe
kabuk olarak bir tane ), FOR / F komutunu deneyin .
Kullanılarak kabul anwser cmd.exe
ve
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 foreach
ve ForEach-Object
Görmekten bilir ForEach ve ForEach-Nesne Ulaşım .
(kredi: PowerShell'de dosyayı satır satır oku )
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 .
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
)
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
]]]
satırlardan
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 /n
ait find
boş satırlar korumak için komuta.
%%A
olarak%A
yapmak için yukarıdaki komutta değiştirin. Aksi takdirde alacaksınız%%A was unexpected at this time.
.