Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] параметры цикла for для построчного анализа текстового файла?!

Ответить
Настройки темы
CMD/BAT - [решено] параметры цикла for для построчного анализа текстового файла?!

Пользователь


Сообщения: 58
Благодарности: 1

Профиль | Отправить PM | Цитировать


Добрый день!
Есть необходимость построчно проанализировать содержимое текстового файла. Никак не могу определиться с синтаксисом.
@for /f "tokens=*" %%A in (c:\text.txt) do @echo %%A – не работает

Отправлено: 15:52, 04-02-2008

 

Пользователь


Сообщения: 79
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Я не сильно всматривался, но очевидное отличие в двоеточии goto :start »
Двоеточие - оно и у меня в файле есть и в коде Iska...Или я вас не так понял.


megaloman, спасибо за подробное объяснение вашего кода! Я в CMD новичок, прогую на других языках, CMD дается тяжелее из-за сильных различий по отношению к другим языкам.

Несколько вопросов по поводу вашего кода.

Поясните пожалуйста, для чего нужно два знака процента у переменных:
Цитата megaloman:
"%%i" "%%j" "%%k" »
Можно же писать и так: "%i%" "%j%" "%k%"? В чем разница ?

Не понял для чего нужна тильда:
Цитата megaloman:
"%~1=%~4" »
?

И зачем нужно
Цитата megaloman:
%%a »
при вызове процедуры Ident ?

Отправлено: 14:32, 28-07-2017 | #41



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Burning Hell:
Поясните пожалуйста, для чего нужно два знака процента у переменных:
Цитата megaloman:
"%%i" "%%j" "%%k" »
Можно же писать и так: "%i%" "%j%" "%k%"? В чем разница ? »
Нельзя. %%i и т.д. — специальные переменные цикла разбора. Два символа % нужно из-за того, что цикл разбора используется внутри пакетного файла, а не непосредственно в командной строке. В отличие от них, %i% и т.д. — обычные переменные окружения.

Цитата Burning Hell:
Не понял для чего нужна тильда:
Цитата megaloman:
"%~1=%~4" »
? »
Для того, чтобы убрать кавычки (буде таковые) в значениях переменных %1 и %4.
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:41, 28-07-2017 | #42


Ветеран


Contributor


Сообщения: 2727
Благодарности: 1697

Профиль | Отправить PM | Цитировать


Цитата Burning Hell:
И зачем нужно %%a при вызове процедуры Ident ? »
Для понимания проделайте код:
Код: Выделить весь код
@Echo Off
cls

Call :get_params_from_main_config "D:\codes\common\init_environment.sas" ""lasr_port" "lasr_host""

pause
GoTo :Eof

:get_params_from_main_config
	Echo %1
	Echo %2
	Echo:
	Echo %~2
	For %%a In (%~2) Do Echo Call :Ident %%a "%%i" "%%j" "%%k"
GoTo :Eof
В цикле последовательно из списка, взятого из переданного аргумента %~2 подпрограммы в подпрограмму :Ident для каждой строки для сравнения передаём имя искомого параметра.
Зачем нужна ~
Проделайте команду For /? >D:\_For.help и почитайте файл D:\_For.help Там ближе к концу это описано.
Смысл совпадает как для переменных цикла, так и для аргументов подпрограммы

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 28-07-2017 в 15:36.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:21, 28-07-2017 | #43


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Для понимания проделайте код:
Код: Выделить весь код
… Call :Ident …
»
:Ident по пути потерялась?

Отправлено: 15:40, 28-07-2017 | #44


Ветеран


Contributor


Сообщения: 2727
Благодарности: 1697

Профиль | Отправить PM | Цитировать


Iska, там эхо для иллюстрации работы For, реального вызова :Ident нет

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 15:52, 28-07-2017 | #45


Пользователь


Сообщения: 79
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Если в значении имеются спецсимволы типа % и др. работать будет неправильно из-за особенностей разбора текста в CMD. »
Еще такой вопрос. В значение хоста есть дефис и точки. Будут ли с ними проблемы?

Отправлено: 16:13, 28-07-2017 | #46


Ветеран


Contributor


Сообщения: 2727
Благодарности: 1697

Профиль | Отправить PM | Цитировать


Burning Hell,
Я тестировал на Вашем примере, для точек и минусов проблем нет
Код: Выделить весь код
%global vaRepLib vaRepLib lasr_port lasr_engine lasr_tag lasr_host lasr_signer lasr_options metaport metaprotocol metarepository lasr_sig_files_path;
			
%let vaRepLib = lasrlib;
%let lasr_port = 2289;
%let lasr_engine = sasiola;
%let lasr_tag = va_pub;
%let lasr_host = sas-vaar.dev.rnw;
%let lasr_signer = %str("http://sas-metadata.dev.rnw:85/SASLASRAuthorization");
%let lasr_options = %str(tag=&lasr_tag port=&lasr_port host="&lasr_host" signer=&lasr_signer);
Пытался понять, где у Вас не получалось. Слегка для себя модернизировал Ваш (после Iska и вставки моей процедуры) код. Естественно, полноценно тестировать не в состоянии, нет sas.exe. Работает.
Код: Выделить весь код
@Echo Off
cls

Set /A Iter=0

:Begin
If %Errorlevel%==2 GoTo :Eof

Set /A Iter+=1
Echo +++ Begin %Iter% Iteration

Set "DD=%Date:~0,2%"
set "MM=%Date:~3,2%"
set "YYYY=%Date:~6,4%"

Set "HH=%Time: =0%"
Set "MN=%HH:~3,2%"
Set "SS=%HH:~6,2%"

Set "HH=%HH:~0,2%"
Set "FMT=AM"

If %HH% GTR 12 (
	Set "FMT=PM"
	Set /A HH=%HH%-12+100
)
If %HH% GTR 100 Set "HH=%HH:~1,2%" 
If %HH%==00 Set "HH=12"

Set "LogFile=D:\logs\check_va_lasr_status_%YYYY%-%MM%-%DD%__%HH%.%MN%.%SS% %FMT%.log" 

Call "D:\SAS\sas.exe" -sysin "D:\codes\check_va_lasr\check_va_lasr_status.sas" -log "%LogFile%"

Call :get_params_from_main_config "D:\codes\common\init_environment.sas" ""lasr_port" "lasr_host""

>nul 2>&1 findstr.exe /i /l /c:"error" /c:"connection" /c:"lasr" /c:"%lasr_port%" /c:"%lasr_host%" "%LogFile%" && (
	Call "D:\SAS\sas.exe" -sysin "D:\codes\check_va_lasr\check_lasr_log_and_run.sas" -nolog
	CHOICE /C YN /T 15 /D N /M "Iteration %Iter% finished with Errors. Y - Continue, N - Cancel."
	Echo:
	GoTo :Begin
) || (
	Echo +++ Iteration %Iter% finished successfully
	GoTo :Eof
)

GoTo :Eof

:get_params_from_main_config
	Set "Key=let"
	FOR /F "usebackq tokens=1,2,3 delims==; " %%i IN (`more %1 2^>nul`) DO (
		For %%a In (%~2) Do Call :Ident %%a "%%i" "%%j" "%%k"
	)
GoTo :Eof

:Ident
	If /I %2=="%Key%" If /I %1==%3 Set "%~1=%~4"
GoTo :Eof

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 28-07-2017 в 19:16.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:17, 28-07-2017 | #47


Пользователь


Сообщения: 79
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата Iska:
Или ещё.
Код:
type "%full_log_path%" | >nul 2>&1 findstr.exe /i /l /c:"word1" /c:"word2" /c:"word3" && echo Found || echo Not found »
Сейчас тестировал этот момент и обнаружил, что даже если в целевом файле найдено хотя бы одно слово из трех (например, первое), то уже выводится "Found". Как сделать, чтобы "Found" выводилось только при нахождении всех трех слов (логическое "И")?

Отправлено: 15:09, 07-08-2017 | #48


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Burning Hell:
Сейчас тестировал этот момент и обнаружил, что даже если в целевом файле найдено хотя бы одно слово из трех (например, первое), то уже выводится "Found". »
Именно так.

Цитата Burning Hell:
Как сделать, чтобы "Found" выводилось только при нахождении всех трех слов (логическое "И")? »
Можно, конечно, сделать и одним findstr, но уж больно монструозно будет, поскольку потребует 6 (3! = 6) перестановок:
Код: Выделить весь код
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
А для 4 слов понадобится уже 4! = 24 перестановки, что не есть хорошо и правильно.

Посему проще будет так:
Код: Выделить весь код
set /a bFound = 0

type "%full_log_path%" | >nul 2>&1 find.exe /i "word1" && set /a bFound = 1
type "%full_log_path%" | >nul 2>&1 find.exe /i "word2" && set /a bFound = 1
type "%full_log_path%" | >nul 2>&1 find.exe /i "word3" && set /a bFound = 1

if "%bFound%" equ "1" (
	echo Found
) else (
	echo Not found
)
Можно усложнить, убрав лишние проходы:
Код: Выделить весь код
set /a bFound = 0

type "%full_log_path%" | >nul 2>&1 find.exe /i "word1" && (
	type "%full_log_path%" | >nul 2>&1 find.exe /i "word2" && (
		type "%full_log_path%" | >nul 2>&1 find.exe /i "word3" && set /a bFound = 1
	)
)

if "%bFound%" equ "1" (
	echo Found
) else (
	echo Not found
)
Ни то, ни другое не проверялось (оставляю это Вам).

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
Опять же, не проверялось.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:07, 07-08-2017 | #49


Пользователь


Сообщения: 79
Благодарности: 2

Профиль | Отправить PM | Цитировать


Iska, спасибо...Была у меня мысль, что придется для каждого слова отдельный findstr писать, но думал, что можно как-то соптимизировать. Ладно, это не критично. Еще раз спасибо.

Отправлено: 16:12, 07-08-2017 | #50



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] параметры цикла for для построчного анализа текстового файла?!

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Создание текстового файла при условии его отсутствия в папке spilberg Скриптовые языки администрирования Windows 1 12-07-2009 15:58
[решено] Чтение текстового файла с неизвестным именем ZeroCrash AutoIt 4 01-07-2009 19:03
[решено] Заполнение формы на сайте, но с данными из текстового файла ZeroCrash AutoIt 2 24-06-2009 11:04
CMD/BAT - [решено] Как скопировать имя файла из текстового файла в код батника и т.д. Nun-Nun Скриптовые языки администрирования Windows 6 13-05-2009 13:28
CMD/BAT - [решено] вывод текстового файла на экран cmd idsp Скриптовые языки администрирования Windows 6 06-04-2009 07:18




 
Переход