параметры цикла for для построчного анализа текстового файла?!
Добрый день!
Есть необходимость построчно проанализировать содержимое текстового файла. Никак не могу определиться с синтаксисом. @for /f "tokens=*" %%A in (c:\text.txt) do @echo %%A – не работает |
@for /f "delims=" %%A in (c:\text.txt) do @echo %%A
|
Petya V4sechkin, я так написал точьвточь - ничего не выдаёт.
как быть? мне тоже надо. |
Ingolder, не стесняйтесь подробнее описывать проблему.
|
пишу в батнике:
@for /f "tokens=*" %%A in (c:\text.txt) do @echo %%A не выводит вообще ничего. куда ж уж подробнее?. p.s. пишу: @for /f "delims=" %%A in (c:\text.txt) do @echo %%A ничего не выводит |
Ingolder,
А конкретнее? Что происходит, неужели совсем ничего? Это возможно только если файл tex.txt пуст...Если это единственная строка в *.bat, то добавьте после неё "pause" |
Цитата:
|
Цитата:
Цитата:
|
1. Проверить кодировку файла
2. можно попробовать объединить: "tokens=* delims=" 3. а еще перед циклом добавить setlocal enableextensions |
спасибо помогло "tokens=* delims="
|
Цитата:
Цитата:
|
запиши одной строкой
@for /f "tokens=*" %%A in (c:\text.txt) do @echo %%A |
Всем добрый день.
Пытаюсь считать содержимое текстового файла, чтобы проверить наличие внутри него отдельных ключевых слов. Проблема в том, что в имени файла находится пробел. Пробовал брать путь вместе с именем файла в двойные кавычки, но тогда это воспринимается просто как строка. Без кавычек режет до пробела. Подскажите как быть, я новичок в cmd. Вот код: Код:
for /f "tokens=*" %%A in ("D:\InforSec\scripts\read_log\text_test_log tst.txt") do @echo %%A Код:
find /I D:\InforSec\scripts\read_log\text_test_log tst.txt "error" |
Код:
FOR /F "usebackq delims=" %%s IN ("D:\InforSec\scripts\read_log\text_test_log tst.txt") DO echo %%s |
Цитата:
Код:
@echo off |
Возник еще вот какой вопрос.
Мне нужно проверить наличие в файле нескольких ключевых слов. Сейчас использую один цикл for для поиска одного слова (код ниже). Код:
for /f %%s in ('find /I "error" "%full_log_path%"') do ( Можно ли как-то оптимизировать это, т.е. проверить наличие в файле нескольких слов, используя вложенный цикл for или еще каким-либо образом? |
Цитата:
Код:
type "%full_log_path%" | >nul 2>&1 findstr.exe /i /l /c:"word1" /c:"word2" /c:"word3" && echo Found || echo Not found |
Iska, а включить это в условие можно как-нибудь? Если слова найдены, то соответствующий флаг = true, иначе = false
И вопрос по самому коду: что делает вот этот кусок кода: Код:
>nul 2>&1 |
Цитата:
Код:
type "%full_log_path%" | >nul 2>&1 findstr.exe /i /l /c:"word1" /c:"word2" /c:"word3" && set flag=true || set flag=false Цитата:
|
Iska, еще один сложный для меня момент хотел спросить.
У меня есть скрипт (код), в котором я хочу найти несколько фраз и вырезать из этих фраз подстроки. Т.е., в коде есть строчка: lasr_port = 2289. Как мне вырезать в переменную номер порта, если номер этой строчки в исходном файле может меняться? |
Цитата:
Цитата:
Цитата:
|
Цитата:
Код:
%global vaRepLib vaRepLib lasr_port lasr_engine lasr_tag lasr_host lasr_signer lasr_options metaport metaprotocol metarepository lasr_sig_files_path; Цитата:
lasr_host. |
Цитата:
Цитата:
Скрытый текст
Код:
@echo off |
Цитата:
|
Цитата:
|
Iska, возникло несколько вопросов.
Что означает вот этот оператор Цитата:
Для чего нужны квадратные скобки Цитата:
Также я не очень понял, что делают вот эти два параметра после setlocal: Цитата:
Цитата:
|
Цитата:
Цитата:
Код:
%let lasr_port = 2289; Код:
%let lasr_port = 2289; Код:
set s%%i=%%j Код:
set slasr_port=2289 Цитата:
|
Iska, правильно я понял, что
Цитата:
|
Burning Hell, правильно. В том числе и пустая последовательность. К сожалению, реализация регулярок у findstr.exe весьма куцая.
|
Как вариант (если после равно в строке всякие спкцсимволы - не годится)
Код:
@Echo Off |
Iska, подскажите пожалуйста еще пару моментов..
Что такое Цитата:
Цитата:
Еще такой вопрос...Код, который ищет lasr_port и lasr_host я положил в отдельный батник (например, 2.bat) и хочу его вызвать из основного батника (например, 1.bat) с соответствующими параметрами. Пишу так: Код:
call 2.bat lasr_port lasr_host Код:
) do set s%%i=%%j Можно ли как-то передать найденное значение 2289 (lasr_port) в батник 1.bat? |
Burning Hell, 1.bat
Код:
@Echo Off Код:
Set "Key=let" |
Цитата:
Цитата:
|
Цитата:
Вопрос у меня вот какой...Можно ли перейти по метке из конца батника в его начало и заново повторить шаги? Код сейчас выглядит примерно так: Код:
:start |
Цитата:
Код:
endlocal & set /a %3=%slasr_port% & %4=%lasr_host% |
Цитата:
Цитата:
|
Вложений: 1
Iska, код приложил.
Смысл работы скрипта в следующем. Запускается сторонний процесс, который проверяет запущенность некоторого сервера. Далее формируется лог и в случае, если сервер не запущен, в нем будут ошибки. Если ошибки обнаружены, запускается другой сторонний процесс, который уже запускает сервер. После этого я хочу еще раз проверить запустился ли сервер (и если в логе по прежнему есть ошибки, то опять запустить сервер). Поэтому я придумал тему с меткой перехода в начало скрипта (goto start), но почему-то она не срабатывает... |
Цитата:
Скрытый текст
Код:
:start |
Iska, но я не вижу никакой разницы...
|
Burning Hell,
Цитата:
Вот Ваш код с поправками Iska (я не вчитывался сильно в код и, естественно, не могу его полноценно тестировать) с встроенной моей процедурой
Код:
@Echo Off Попробую в темпе пояснить мою процедуру
Код:
Call :get_params_from_main_config "D:\codes\common\init_environment.sas" ""lasr_port" "lasr_host"" Список искомых параметров в виде ""Парам1" "Парам2" ..."ПарамN"" После работы процедуры получим переменные, которым присвоены найденные (если они есть) значения %Парам1% %Парам2% ... %ПарамN% Под первым For команда (`more %1 2^>nul`) more отображает содержимое файла, имя которого "Имя анализируемого файла" передано в первом аргументе процедуры %1. (смотрите more /? For /?) 2^>nul Подавит вывод сообщения об ошибке, если файл не найден. При этом после Do в For исполняться ничего не будет В "анализируемом файле" искомые параметры содержатся в строке вида %let Параметр = значение; Её надо разобрать на подстроки по разделителям "=; " 1. %let 2. Параметр 3. значение То есть в For имеем ... tokens=1,2,3 delims==; " и они помещаются в переменных %%i %%j %%k Возможные неприятности: Если в Параметре или значении есть пробел - работать будет неправильно из-за использования в качестве разделителя пробела. Если в значении имеются спецсимволы типа % и др. работать будет неправильно из-за особенностей разбора текста в CMD. (Описанный баг не баг вовсе а фича :) Вложенный в первый For второй For вызавает процедуру :Ident куда передаёт последовательно каждое имя параметра %%a из полученного списка %~2 (передали ""Парам1" "Парам2" ..."ПарамN"" , после ~ имеем "Парам1" "Парам2" ..."ПарамN") и куски строк из файла в аргументах "%%i" "%%j" "%%k" В процедуре :Ident %2 -первый кусок строки (если это было %let то при передаче % потерялось) Итак, если первый кусок строки == "let" (let ранее запомнил в переменную %Key%, стараюсь исходные данные вытянуть за код, чтобы можно было легко изменить при надобности - здесь, похоже, это паранойя), сравнение без учета регистра If /I (смотрим If /?) If /I %2=="%Key%" и если переданное имя параметра совпадает с именем параметра в строке If /I %1==%3 (%3 кусок строки с именем параметра, если строка начинается на let) то переменной с именем нужного параметра %~1 присваиваем найденное значение Set "%~1=%~4" Лирическое отступление 1. Я стремлюсь операторы типа Set Строка=Значение писать в виде Set "Строка=Значение", что позволяет гарантировать отсутствие невидных пробелов после Значение. Лирическое отступление 2. Извините за длинноты объяснения, не было времени написать кратко |
Цитата:
megaloman, спасибо за подробное объяснение вашего кода! Я в CMD новичок, прогую на других языках, CMD дается тяжелее из-за сильных различий по отношению к другим языкам. Несколько вопросов по поводу вашего кода. Поясните пожалуйста, для чего нужно два знака процента у переменных: Цитата:
Не понял для чего нужна тильда: Цитата:
И зачем нужно Цитата:
|
Цитата:
Цитата:
|
Цитата:
Код:
@Echo Off Зачем нужна ~
Проделайте команду For /? >D:\_For.help и почитайте файл D:\_For.help Там ближе к концу это описано.
Смысл совпадает как для переменных цикла, так и для аргументов подпрограммы |
Цитата:
|
Iska, там эхо для иллюстрации работы For, реального вызова :Ident нет
|
Цитата:
|
Burning Hell,
Я тестировал на Вашем примере, для точек и минусов проблем нет
Код:
%global vaRepLib vaRepLib lasr_port lasr_engine lasr_tag lasr_host lasr_signer lasr_options metaport metaprotocol metarepository lasr_sig_files_path; Пытался понять, где у Вас не получалось. Слегка для себя модернизировал Ваш (после Iska и вставки моей процедуры) код. Естественно, полноценно тестировать не в состоянии, нет sas.exe. Работает.
Код:
@Echo Off |
Цитата:
|
Цитата:
Цитата:
Код:
type "%full_log_path%" | >nul 2>&1 findstr.exe /i /r /c:"word1.*word2.*word3" /c:"word1.*word3.*word2" /c:"word2.*word1.*word3" /c:"word2.*word3.*word1" /c:"word3.*word1.*word2" /c:"word3.*word2.*word1" && echo Found || echo Not found Посему проще будет так: Код:
set /a bFound = 0 Код:
set /a bFound = 0 P.S. Интересно, то будет в этом случае: Код:
type "%full_log_path%" | >nul 2>&1 findstr.exe /i /v /l /c:"word1" /c:"word2" /c:"word3" && echo Not found || echo Found |
Iska, спасибо...Была у меня мысль, что придется для каждого слова отдельный findstr писать, но думал, что можно как-то соптимизировать. Ладно, это не критично. Еще раз спасибо.
|
Burning Hell,
Вот мой вариант AND для произвольного числа искомых слов в файле
Код:
@Echo Off Код:
Call :IfAND "%LogFile%" "error" "connection" "lasr" "%lasr_port%" "%lasr_host%" - в остальных аргументах -искомые слова в кавычках. Здесь пять слов. Уберите лишние. Процедура возвращает %ErrorLevel%==0 если все слова найдены, иначе %ErrorLevel%==1 Код:
type "%full_log_path%" | >nul 2>&1 find.exe |
Цитата:
|
Время: 15:08. |
Время: 15:08.
© OSzone.net 2001-