Jak zapętlić każdą linię w pliku tekstowym za pomocą pliku wsadowego systemu windows?

Chciałbym wiedzieć, jak zapętlić każdą linię w pliku tekstowym za pomocą pliku wsadowego Windows i przetworzyć każdą linię tekstu po kolei.

Author: Matthew Murdoch, 2008-10-01

10 answers

Poniższe posty bardzo pomogły, ale nie zrobiły tego, co powiedziałem w moim pytaniu, gdzie musiałem przetworzyć całą linię jako całość. Oto, co znalazłem.

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

Słowo kluczowe tokens z gwiazdką ( * ) spowoduje pobranie całego tekstu dla całej linii. Jeśli nie umieścisz gwiazdki, pociągnie tylko pierwsze słowo na linii. Zakładam, że ma to związek ze spacjami.

For Command on TechNet

Doceniam wszystkie posty!

Jeśli są spacjami w ścieżce pliku, musisz użyć usebackq. Na przykład.

for /F "usebackq tokens=*" %%A in ("my file.txt") do [process] %%A
 256
Author: Mr. Kraus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-25 08:29:53

Z linii poleceń systemu Windows reference:

Aby przetworzyć plik, ignorując skomentowane linie, wpisz:

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

To polecenie przetwarza każdą linię w pliku Myfile.txt, ignorując linie rozpoczynające się średnikiem i przekazując drugi i trzeci token z każdej linii do ciała FOR (tokeny są rozdzielane przecinkami lub spacjami). Treść instrukcji FOR odwołuje się do %i, aby uzyskać drugi token, %j, aby uzyskać trzeci token, a %k, aby uzyskać wszystkie pozostałe tokeny.

Jeśli nazwa pliku jeśli podajesz spacje, użyj cudzysłowów wokół tekstu (na przykład "nazwa pliku"). Aby użyć cudzysłowów, musisz użyć usebackq. W przeciwnym razie cudzysłowy są interpretowane jako definiujące literalny ciąg znaków do analizy.

Przy okazji, plik pomocy wiersza poleceń większości systemów Windows można znaleźć pod adresem:

 "C:\WINDOWS\Help\ntcmds.chm"
 52
Author: Ash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-08 10:29:44

W pliku wsadowym musisz użyć %% zamiast %: (Type 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

Co to robi: "Do call: process %%i % % j % % k" na końcu polecenia for przekazuje informacje uzyskane w poleceniu for z myfile.txt do podprogramu "proces".

Gdy używasz polecenia for w programie wsadowym, musisz użyć znaków podwójnego % dla zmiennych.

Następujące linie przekazują te zmienne z polecenia for do procesu 'sub routine' i pozwalają na przetwarzanie tych informacji.

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

Mam kilka dość zaawansowanych zastosowań tej konfiguracji, które chciałbym podzielić się, jeśli potrzebne są dalsze przykłady. Oczywiście dodaj EOL lub Delims w razie potrzeby.

 30
Author: user332474,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-20 21:40:40

Ulepszenie pierwszego " FOR / F.."odpowiedz: To, co musiałem zrobić, to wywołać execute każdego skryptu wymienionego w MyList.txt, więc u mnie zadziałało:

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

-- lub, jeśli chcesz to zrobić przez wiele linii:

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

Edit: powyższy przykład służy do wykonywania pętli FOR z wiersza polecenia; ze skryptu wsadowego należy dodać dodatkowe %, jak pokazano poniżej:

---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---
 22
Author: Yogesh Mahajan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-24 06:07:02

@MrKraus ' S odpowiedź jest pouczająca. Co więcej, dodam, że Jeśli chcesz załadować plik znajdujący się w tym samym katalogu co plik wsadowy, przedrostek nazwy pliku to %~dp0. Oto przykład:

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

Uwaga: : Jeśli nazwa pliku lub katalogu (np.txt w powyższym przykładzie) posiada spację (np. ' mój plik.txt 'or' c:\Program plików"), użycie:

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

, ze słowem kluczowym typu wywołującym program type, który wyświetla zawartość tekstu plik. Jeśli nie chcesz ponosić kosztów wywołania polecenia type, powinieneś zmienić katalog na katalog pliku tekstowego. Zauważ, że typ jest nadal wymagany dla nazw plików ze spacjami.

Mam nadzieję, że to komuś pomoże!
 20
Author: Marvin Thobejane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:34

Przyjęta odpowiedź jest dobra, ale ma dwa ograniczenia.
Upuszcza puste linie i linie zaczynające się od ;

Aby czytać wiersze dowolnej treści, potrzebujesz opóźnionego rozszerzenia przełączającego technic.

@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 jest używany do poprzedzania każdej linii numerem linii i dwukropkiem, więc puste linie nie są już puste.

DelayedExpansion musi być wyłączony, podczas uzyskiwania dostępu do parametru %%a, inaczej wykrzykniki ! i karetki ^ zostaną utracone, ponieważ mają specjalne znaczenia w tym trybie.

Ale aby usunąć numer linii z linii, należy włączyć opóźnione rozszerzenie.
set "var=!var:*:=!" usuwa wszystkie do pierwszego dwukropka (użycie delims=: usunie również wszystkie dwukropki na początku wiersza, nie tylko ten z findstr).
Endlocal ponownie wyłącza opóźnioną rozbudowę dla następnej linii.

Jedynym ograniczeniem jest teraz granica długości linii wynosząca ~8191, ale wydaje się, że nie ma sposobu, aby to przezwyciężyć.

 14
Author: jeb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-19 17:48:14

Lub możesz wykluczyć opcje w cudzysłowach:

FOR /F %%i IN (myfile.txt) DO ECHO %%i
 13
Author: Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-12 13:18:09

Oto plik bat, który napisałem, aby wykonać wszystkie skrypty SQL w folderze:

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
 9
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-01 02:08:09

Jeśli masz okna z rodziny NT (z cmd.exe jako powłoką), spróbuj polecenia FOR /F .

 5
Author: Michael Ratanapintha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-01 02:08:56

Zmodyfikowane przykłady tutaj, aby wymienić nasze aplikacje Rails na Heroku-dzięki!

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

Pełny kod tutaj .

 1
Author: sendbits,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-11 19:27:38