Przygotowałem skrypt, który analizuje plik tekstowy pod kątem wybranego ciągu znaków (polecenie findstr). Przygotowałem też zliczanie ilości linii z pliku oraz wyświetlanie numeru linii, w której wystąpił ten znak. Np. wyszykuję ciągu znaków “abc” i załóżmy, że abc będzie w drugiej linii to wyświetli mi na ekranie:
Linia 2: abc
Proste prawda?
Napotykam jednak problem w przypadku, gdy w wyszukiwanej linii wystąpi “znak specjalny” pipe, czyli |. Załóżmy, ze druga linia pliku tekstowego to:
abc | coś tam | coś tam
Wtedy zamiast Linia 2: abc
dostaję na ekranie: "cos tam" is not recognized as an internal or external command, operable program or batch file.
Jak zmusić BAT, żeby ignorował tego typu znaki specjalne w pobierane z pliku tekstowego? Jedyne, co osiągnąłem to dać cudzysłów dla zmiennej, ale wtedy otrzymam "Linia 2: abc"
Najpierw wyświetlasz ten tekst i podmieniasz
| na ^| i pipem wynik tego dajesz do swojego skryptu
oczywiście przy zamianie zmieniasz ^| na ^^^^| aby to traktowane było jako zwykły tekst.
Działa! Po testach okazało się, ze wystarczyło jednego “znaku ucieczki”. Swoją drogą to dziwne, że komenda echo, która ma tylko czytać tekst interpretuje jakieś znaki specjalne.
set /a "l=0" for /f “tokens=*” %%L in (‘type “plik.txt”’) do ( set "txt=%%L" set "ftxt=!txt:|=^|!" set /a "l=!l!+1" set "linia=Linia !l!: " echo !linia!!ftxt! | find "b" ) pause > nul
Niestety okazało się, że skrypt ignoruje puste linie między wierszami i ich nie liczy…