Chciałbym wiedzieć, jak zapętlać każdą linię w pliku tekstowym za pomocą pliku wsadowego systemu Windows i przetwarzać kolejno każdą linię tekstu.
windows
batch-file
Pan Kraus
źródło
źródło
%%A
ze%A
w powyższym poleceniu. W przeciwnym razie dostaniesz%%A was unexpected at this time.
.for /F "tokens=*" %%A in ("myfile.txt") do echo A = %%A
->A = myfile.txt
Jakieś pomysły jak to udaremnić.?Z odwołania do wiersza poleceń systemu Windows:
Aby przeanalizować plik, ignorując skomentowane linie, wpisz:
To polecenie analizuje każdą linię w Myfile.txt, ignorując linie rozpoczynające się średnikiem i przekazując drugi i trzeci token z każdej linii do treści FOR (tokeny są rozdzielane przecinkami lub spacjami). Treść instrukcji FOR odwołuje się do% i, aby uzyskać drugi token,% j, aby uzyskać trzeci token, i% k, aby uzyskać wszystkie pozostałe tokeny.
Jeśli podane nazwy plików zawierają spacje, użyj cudzysłowów wokół tekstu (na przykład „Nazwa pliku”). Aby użyć cudzysłowu, musisz użyć usebackq. W przeciwnym razie znaki cudzysłowu są interpretowane jako definiujące dosłowny ciąg do analizy.
Nawiasem mówiąc, plik pomocy wiersza polecenia można znaleźć w większości systemów Windows pod adresem:
źródło
usebackq
” :for /f "usebackq" %%a in ("Z:\My Path Contains Spaces\xyz\abc.txt")
W pliku wsadowym MUSISZ użyć
%%
zamiast%
: (Typhelp for
)Co to robi: „do call: proces %% i %% j %% k” na końcu polecenia for przekazuje informacje uzyskane w poleceniu for z pliku myfile.txt do podprogramu „process”.
Kiedy używasz polecenia for w programie wsadowym, musisz użyć podwójnych znaków% dla zmiennych.
Poniższe wiersze przekazują te zmienne z polecenia for do podprogramu procesu i umożliwiają przetwarzanie tych informacji.
Mam kilka całkiem zaawansowanych zastosowań tej dokładnej konfiguracji, którą chętnie podzielę się, jeśli będą potrzebne dalsze przykłady. Oczywiście dodaj EOL lub Delims.
źródło
Poprawianie pierwszej odpowiedzi „FOR / F ..”: Musiałem wywołać wykonanie każdego skryptu wymienionego w MyList.txt, więc zadziałało dla mnie:
--LUB, jeśli chcesz to zrobić przez wiele linii:
Edycja: Powyższy przykład dotyczy wykonania pętli FOR z wiersza polecenia; ze skryptu wsadowego należy dodać dodatkowy%, jak pokazano poniżej:
źródło
@ Odpowiedź MrKrausa jest pouczająca. Ponadto pozwól mi dodać, że jeśli chcesz załadować plik znajdujący się w tym samym katalogu, co plik wsadowy, poprzedź nazwę pliku za pomocą% ~ dp0. Oto przykład:
Uwaga: Jeśli nazwa lub katalog pliku (np. Mój plik.txt w powyższym przykładzie) ma spację (np. „Mój plik.txt” lub „c: \ Program Files”), użyj:
, ze słowem kluczowym type wywołującym
type
program, który wyświetla zawartość pliku tekstowego. Jeśli nie chcesz ponosić nakładów związanych z wywoływaniem polecenia type, zmień katalog na katalog pliku tekstowego. Zauważ, że typ jest nadal wymagany dla nazw plików ze spacjami.Mam nadzieję, że to komuś pomoże!
źródło
**cd /d %~dp0**
przed pętlą for. Zapewniłoby to odniesienie do pliku w katalogu, w którym znajduje się plik wsadowy. Dzięki za obserwacjętype
Walkaroundtype
obejść problemu, musiałem zacytować swoją nazwę pliku, ponieważ jest on w innym katalogu, który zawiera spacje (choleraProgram Files
). Dostaję błądThe system cannot find the file `type.
Przyjęta odpowiedź jest dobra, ale ma dwa ograniczenia.
Zrzuca puste linie i linie zaczynające się od
;
Aby odczytać wiersze dowolnej treści, potrzebujesz techniki przełączania opóźnionego rozszerzenia.
Findstr służy do poprzedzania każdej linii numerem linii i dwukropkiem, więc puste linie nie są już puste.
DelayedExpansion należy wyłączyć podczas uzyskiwania dostępu do
%%a
parametru, w przeciwnym razie wykrzykniki!
i znaki^
zostaną utracone, ponieważ mają one specjalne znaczenie 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życiedelims=:
spowoduje usunięcie wszystkich dwukropków na początku linii, nie tylko tego z findstr).Endlocal ponownie wyłącza opóźnione rozwinięcie dla następnej linii.
Jedynym ograniczeniem jest teraz limit długości linii wynoszący ~ 8191, ale wydaje się, że nie ma sposobu na obejście tego.
źródło
setlocal
na polecenie. Kiedy uruchamiam kod na CMD, dostaję! Var! zamiast pustych miejsc. Jak naprawić?Lub możesz wykluczyć opcje w cudzysłowach:
źródło
Oto plik nietoperza, który napisałem, aby wykonać wszystkie skrypty SQL w folderze:
źródło
Jeśli masz NT-rodziny Windows (jedna z
cmd.exe
jak skorupy), spróbuj polecenia FOR / F .źródło
Akceptowana odpowiedź przy użyciu
cmd.exe
idziała tylko dla „normalnych” plików. Zawodzi żałośnie przy dużych plikach.
W przypadku dużych plików może być konieczne użycie programu Powershell i czegoś takiego:
lub jeśli masz wystarczającą ilość pamięci:
Działa to dla mnie z plikiem 250 MB zawierającym ponad 2 miliony linii, w którym
for /F ...
polecenie utknęło po kilku tysiącach linii.Różnice między
foreach
iForEach-Object
zobacz Poznanie ForEach i ForEach-Object .(kredyty: Czytaj plik linia po linii w PowerShell )
źródło
Zmodyfikowane przykłady tutaj, aby wyświetlić listę naszych aplikacji Railsowych na Heroku - dzięki!
Pełny kod tutaj .
źródło
for /f "tokens=1" %%i in ('find /v "=" heroku_apps.txt ^| find /v ".TXT" ^| findstr /r /v /c:"^$"') do...
(Zwróć uwagę na dodanie^
for
Aby wydrukować wszystkie wiersze w pliku tekstowym z wiersza poleceń (z rozszerzeniem opóźnionym):
Działa z wiodącymi białymi spacjami, pustymi liniami i białymi liniami.
Testowany na Win 10 CMD
źródło
]]]
linie wiodące z linii, druga próbka upuszcza puste linie i linie zaczynające się od spacjidelims
jeśli dowolne wiersze w pliku tekstowym zaczynają się od]
np. zamień na jakiś znak, który tego nie robi, lub na znak kontrolny, taki jak Backspace lub Bell; zwykle nie występują w plikach tekstowych. Powodemdelims=]
jest usunięcie zastępcze stworzone przez/n
zfind
poleceniem, aby zachować puste linie.