Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Наличие текста с условиями (http://forum.oszone.net/showthread.php?t=315054)

POSTREALITY 20-05-2016 15:58 2636226

Наличие текста с условиями
 
Друзья, здравствуйте.
Помогите пожалуйста, сам не могу сообразить.
Необходимо написать код с следующими условиями:
Есть текстовый файл Q:\TesT.txt, необходимо читать этот файл и если в нём есть текст "CLIENT_CODE", то - GOTO :1, а если данного текста в этом файле нет то GOTO :2
Подскажите пожалуйста, вообще не могу понять как это сделать.
Спасибо!

megaloman 20-05-2016 16:13 2636232

Код:

@Echo off
cls

findstr /I /C:CLIENT_CODE Q:\TesT.txt >nul

If %Errorlevel%==0 (
        Echo Yes
) Else (
        Echo No
)       


pause

Если делать дословно, как Вы требуете (мне GoTo не нравится), то можно так

Код:

@Echo off
cls

findstr /I /C:CLIENT_CODE Q:\TesT.txt >nul
If %Errorlevel%==0 GoTo :1
GoTo :2

:1
Echo Yes
GoTo :Eof

:2
Echo No
GoTo :Eof

Либо вместо If
Код:

findstr /I /C:CLIENT_CODE Q:\TesT.txt >nul&&GoTo :1
GoTo :2

ИМХО, GoTo :2 и вовсе не нужно, можно написать со следующей строки код, который Вы хотите написать после метки :2, после GoTo :1
Код:

@Echo off
cls
findstr /I /C:CLIENT_CODE Q:\TesT.txt >nul&&GoTo :1
:2
Echo No
GoTo :Eof
:1
Echo Yes
GoTo :Eof




alpap 20-05-2016 17:13 2636244

Или так:
Код:

@echo off
<"file.txt">nul findstr/ic:"CLIENT_CODE" && call :p1 || call :p2
pause>nul

:p1
 echo:Есть такой текст
exit/b

:p2
 echo:Нет такого текста
exit/b

.

POSTREALITY 20-05-2016 17:59 2636258

Цитата:

Цитата megaloman
findstr /I /C:CLIENT_CODE Q:\TesT.txt >nul If %Errorlevel%==0 ( Echo Yes ) Else ( Echo No ) »

Цитата:

Цитата alpap
<"file.txt">nul findstr/ic:"CLIENT_CODE" && call :p1 || call :p2 pause>nul :p1 echo:Есть такой текст exit/b :p2 echo:Нет такого текста exit/b »

Ещё больше запутался )))
Тут дело в том, что я полностью запутался в последовательностях

Есть вот такой код:
Код:

findstr /I /C:CLIENT_CODE Q:\error.lim >nul
ТУТ ВАШИ ОТВЕТЫ НА МОЙ ПЕРВЫЙ ВОПРОС

if exist Q:\error.lim (
mailsend1.18.exe *** При выгрузке произошли ошибки  ***
) else (
mailsend1.18.exe *** При выгрузке всё ОК ***
)

if exist Q:\error.lim (
move /Y Q:\error.lim Q:\error\ && rename "Q:\error\error.lim" %FD%_error-FORTS.lim%R%
) else (
goto :FRMB
)

ERROR.LIM это простой текстовик

И смысл в том, чтобы эта схема работала по следующей последовательности:
1) Смотрим, существует ли на диске Q файл error.lim
1.1) Если файл есть, переходим к пункту 2
1.2) Если файла нет, то переходим к метке :FRMB

2) Читаем файл и ищем в нём строку "CLIENT_CODE"
2.1) Если строчка есть то переходим к пункту 3
2.2) Если строчки нет, то УДАЛЯЕМ ФАЙЛ, Отправляем почту *** При выгрузке всё ОК *** и переходим к той-же метке :FRMB

3) Отправляем почту *** При выгрузке произошли ошибки ***, перемещаем файл в директорию Q:\error\ и переименовываем файл под необходимое имя, после всего переходим к той-же метке :FRMB

И вот в данном, конкретном моменте я заблудился, не могу понять, как правильно составить последовательность кода. Почта отправляется, файл перемещается и переименовывается, но последовательность нарушена, по этому программа работает не правильно.

Огромное спасибо за помощь!

megaloman 20-05-2016 21:00 2636316

На ваш код не смотрю, смотрю ваше описание алгоритма и последовательно его переписываю - не надо путаться, надо как в белорусском языке - как слышится, так и пишется :-)
Код:

@Echo off
cls

Set "ErrorLim=Q:\Error.lim"
Set "Code=CLIENT_CODE"
Set "ErrDir=Q:\Error"

SetLocal EnableExtensions EnableDelayedExpansion

If Exist "%ErrorLim%" (
        findstr /I /C:"%Code%" "%ErrorLim%" >nul
        If !Errorlevel!==0 (
                Move "%ErrorLim%" "%ErrDir%\%Date%_%Time::=%_error-FORTS.lim" >nul
                Echo mailsend1.18.exe *** При выгрузке произошли ошибки  ***
        ) Else (
                Del "%ErrorLim%"
                Echo mailsend1.18.exe *** При выгрузке всё ОК ***
        )
)
:FRMB

pause

Метка :FRMB абсолютно не нужна, написал только потому, что она помянута в постановке.
Программы mailsend1.18.exe у меня естественно нет, для отладки поставил на эту строку Echo, чтобы видеть что происходит. Вы Echo уберёте. Как и pause.
Я не знаю, что такое %FD%_error-FORTS.lim%R%, поэтому заменил на имя с датой и временем при переносе-переименовании.

alpap 20-05-2016 21:13 2636317

Код:

@echo off
if exist "Q:\error.lim" <"Q:\error.lim">nul findstr/ic:"CLIENT_CODE" && call :p1 || call :p2
:FRMB
 echo:Продолжение основной программы
exit

:p1
 echo:Отправляем почту *** При выгрузке произошли ошибки ***,& goto FRMB
exit/b

:p2
 echo:УДАЛЯЕМ ФАЙЛ, Отправляем почту *** При выгрузке всё ОК ***,& goto FRMB
exit/b

.

Даже по сути и "& goto FRMB" не нужно, мы и так будем возвращаться в эту строку ":FRMB", которая тоже не нужна.

POSTREALITY 25-05-2016 20:59 2637642

Цитата:

Цитата megaloman
На ваш код не смотрю, смотрю ваше описание алгоритма и последовательно его переписываю - не надо путаться, надо как в белорусском языке - как слышится, так и пишется :-) »

Скажите пожалуйста, а есть ли вариант обойтись без !Errorlevel!, а точнее без EnableDelayedExpansion? Он наглухо рубит работу mailsend. :-(
Спасибо

Цитата:

Цитата alpap
Даже по сути и "& goto FRMB" не нужно, мы и так будем возвращаться в эту строку ":FRMB", которая тоже не нужна. »

Спасибо за помощь, но к сожалению, Ваш вариант не совсем подходит логически. Дело в том, что файл error.lim должен обрабатываться три раза в основной программе, точнее, за цикл одной программы создаётся и обрабатывается три разных файла error.lim, по этому откладывать его обработку и удаление на конец программы нельзя, так как схема должна быть чётко следующая: ПЕРВЫЙ ТРИЦИКЛ: если файл есть и соответствует условиям - перемещаем, сообщаем, если нет - удаляем, сообщаем.
ВТОРОЙ ТРИЦИКЛ: если файл есть и соответствует условиям - перемещаем, сообщаем, если нет - удаляем, сообщаем.
ТРЕТИЙ ТРИЦИКЛ: если файл есть и соответствует условиям - перемещаем, сообщаем, если нет - удаляем, сообщаем.
Если данную логику не соблюдать, то файлы error.lim будут конфликтовать друг с другом.

alpap 25-05-2016 22:10 2637655

POSTREALITY,
Все в точности так и происходит, поставьте в подпрограммы свои нужные команды и убедитесь в этом.

Iska 26-05-2016 07:25 2637698

Цитата:

Цитата alpap
Или так: »

Там не хватает «exit /b» после «pause».


Цитата:

Цитата POSTREALITY
Он наглухо рубит работу mailsend. :-( »

Чего-чего-чего?!

alpap 26-05-2016 09:58 2637731

Цитата:

Цитата Iska
Там не хватает «exit /b» после «pause». »

то сырой еще был, в п5 почти конечный, & goto FRMB надо убрать и :FRMB, за ненадобностью.

POSTREALITY 26-05-2016 10:15 2637734

Цитата:

Цитата Iska
Чего-чего-чего?! »

Правда. Удаляю строку SetLocal EnableExtensions EnableDelayedExpansion всё работает автоматом, но соответственно высылает не правильные сообщения, потому что получает не правильный код ошибки. А когда строка присутствует, то mailsend выдаёт следующее - Type . in a new line and press Enter to end the message, CTRL+C to abort, как избавиться от этой просьбы поставить точку и нажать enter я так и не понял. А мне обязательно, чтобы всё отрабатывалось автоматом, без каких либо манипуляций пользователя.

POSTREALITY 26-05-2016 10:49 2637742

Цитата:

Цитата alpap
Все в точности так и происходит, поставьте в подпрограммы свои нужные команды и убедитесь в этом. »

Действительно, работает по очереди :-)
Но возникла другая проблема:
капля в каплю продублировал Ваш код к себе в команду, но почему-то всегда отрабатывает :p2. Даже если вручную подсовываю в директорию текстовый файл error.lim и внутри пишу CLIENT_CODE, всё равно он идёт по второму пути, как будто ошибок нет.

megaloman 26-05-2016 14:25 2637809

POSTREALITY, Не знаю, чем вам мог досадить EnableDelayedExpansion.
Вот вариант без EnableDelayedExpansion
Код:

@Echo off
cls

Set "ErrorLim=Z:\Error.lim"
Set "Code=CLIENT_CODE"
Set "ErrDir=Z:\Error"

If Not Exist "%ErrorLim%" GoTo :FRMB

        findstr /I /C:"%Code%" "%ErrorLim%" >nul
        If %Errorlevel%==0 (
                Move "%ErrorLim%" "%ErrDir%\%Date%_%Time::=%_error-FORTS.lim" >nul
                mailsend1.18.exe *** При выгрузке произошли ошибки  ***
        ) Else (
                Del "%ErrorLim%"
                mailsend1.18.exe *** При выгрузке всё ОК ***
        )

:FRMB

pause

Если ниже :FRMB батник далее не развивается, то :FRMB можно удалить, при этом сделать
If Not Exist "%ErrorLim%" GoTo :Eof

POSTREALITY 26-05-2016 17:18 2637875

Цитата:

Цитата megaloman
Не знаю, чем вам мог досадить EnableDelayedExpansion. »

ОГРОМНЕЙШЕЕ СПАСИБО!!!
Теперь всё работает как надо!
ЦМДшник получился на полтора листа формата А4 )))

Iska 26-05-2016 17:29 2637882

Цитата:

Цитата POSTREALITY
ЦМДшник получился на полтора листа формата А4 ))) »

Если выложите получившийся полный код — возможно, подсократим ;).

POSTREALITY 26-05-2016 20:33 2637930

Всем спасибо! Всё работает!
Тему можно закрывать!


Время: 13:00.

Время: 13:00.
© OSzone.net 2001-