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

Показать сообщение отдельно

Ветеран


Contributor


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

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


Burning Hell,
Цитата Burning Hell:
но я не вижу никакой разницы... »
Я не сильно всматривался, но очевидное отличие в двоеточии goto :start
Вот Ваш код с поправками Iska (я не вчитывался сильно в код и, естественно, не могу его полноценно тестировать) с встроенной моей процедурой
Код: Выделить весь код
@Echo Off
cls

:start
set day=%date:~0,2%
set month=%date:~3,2%
set year=%date:~6,4%

set /a hour=%time:~0,2%
if %hour% lss 12 (
	set format=AM) else (
	set format=PM)

If %hour% gtr 12 ( set /a hour = %hour% - 12 ) 
If %hour% == 00 ( set hour = 12 )

set /a minute=%time:~3,2%
set /a second=%time:~6,2%

set lasr_log_nm=check_va_lasr_status_%year%-%month%-%day%__%hour%.%minute%.%second% %format%.log

set full_log_path=D:\logs\%lasr_log_nm%

call D:\SAS\sas.exe -sysin D:\codes\check_va_lasr\check_va_lasr_status.sas -log "%full_log_path%"

rem set port=lasr_port
rem set host=lasr_host
rem call :get_params_from_main_config %port% %host% port host
rem type "%full_log_path%" | >nul 2>&1 findstr.exe /i /l /c:"error" /c:"connection" /c:"lasr" /c:"%port%" /c:"%host%" && set lasrError=true || set lasrError=false

Call :get_params_from_main_config "D:\codes\common\init_environment.sas" ""lasr_port" "lasr_host""
type "%full_log_path%" | >nul 2>&1 findstr.exe /i /l /c:"error" /c:"connection" /c:"lasr" /c:"%lasr_port%" /c:"%lasr_host%" && set 

lasrError=true || set lasrError=false

echo lasrError=%lasrError%

if %lasrError%==true (
	call D:\SAS\sas.exe -sysin D:\codes\check_va_lasr\check_lasr_log_and_run.sas -nolog
	echo "Goto second iteration"
	goto :start
) else (
	goto :EOF
)

rem =========================================================================

: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
Аналогичная процедура от Iska убрана
Попробую в темпе пояснить мою процедуру
Код: Выделить весь код
Call :get_params_from_main_config "D:\codes\common\init_environment.sas" ""lasr_port" "lasr_host""
Вызов Call :get_params_from_main_config "Имя анализируемого файла" "Список искомых параметров"
Список искомых параметров в виде ""Парам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, 28-07-2017 в 12:14.

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

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