PDA

Показать полную графическую версию : [решено] Наличие текста с условиями


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

megaloman
20-05-2016, 16:13
@Echo off
cls

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

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


pause

@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
Или так:

@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
findstr /I /C:CLIENT_CODE Q:\TesT.txt >nul If %Errorlevel%==0 ( Echo Yes ) Else ( Echo No ) »
<"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
На ваш код не смотрю, смотрю ваше описание алгоритма и последовательно его переписываю - не надо путаться, надо как в белорусском языке - как слышится, так и пишется :-)@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
@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
На ваш код не смотрю, смотрю ваше описание алгоритма и последовательно его переписываю - не надо путаться, надо как в белорусском языке - как слышится, так и пишется :-) »
Скажите пожалуйста, а есть ли вариант обойтись без !Errorlevel!, а точнее без EnableDelayedExpansion? Он наглухо рубит работу mailsend. :-(
Спасибо

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

alpap
25-05-2016, 22:10
POSTREALITY,
Все в точности так и происходит, поставьте в подпрограммы свои нужные команды и убедитесь в этом.

Iska
26-05-2016, 07:25
Или так: »
Там не хватает «exit /b» после «pause».

Он наглухо рубит работу mailsend. :-( »
Чего-чего-чего?!

alpap
26-05-2016, 09:58
Там не хватает «exit /b» после «pause». »
то сырой еще был, в п5 почти конечный, & goto FRMB надо убрать и :FRMB, за ненадобностью.

POSTREALITY
26-05-2016, 10:15
Чего-чего-чего?! »
Правда. Удаляю строку 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
Все в точности так и происходит, поставьте в подпрограммы свои нужные команды и убедитесь в этом. »
Действительно, работает по очереди :-)
Но возникла другая проблема:
капля в каплю продублировал Ваш код к себе в команду, но почему-то всегда отрабатывает :p2. Даже если вручную подсовываю в директорию текстовый файл error.lim и внутри пишу CLIENT_CODE, всё равно он идёт по второму пути, как будто ошибок нет.

megaloman
26-05-2016, 14:25
POSTREALITY, Не знаю, чем вам мог досадить 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
Не знаю, чем вам мог досадить EnableDelayedExpansion. »
ОГРОМНЕЙШЕЕ СПАСИБО!!!
Теперь всё работает как надо!
ЦМДшник получился на полтора листа формата А4 )))

Iska
26-05-2016, 17:29
ЦМДшник получился на полтора листа формата А4 ))) »
Если выложите получившийся полный код — возможно, подсократим ;).

POSTREALITY
26-05-2016, 20:33
Всем спасибо! Всё работает!
Тему можно закрывать!




© OSzone.net 2001-2012