Сравнение строк

Обсуждение программ nnCron и nnCron LITE

Re: Сравнение строк

Postby MikeSh » Tue, 12 Jan 2016, 13:24

Выглядит красиво...
MikeSh
 
Posts: 14
Joined: Wed, 30 Dec 2015, 17:29

Re: Сравнение строк

Postby MikeSh » Tue, 12 Jan 2016, 14:14

VoidVolker wrote:А зачем регулярное выражение, если там все равно простой поиск?

Опять же это не решает проблему поиска строки целиком
Code: Select all
dsfdsf
sdf
wer
fg            *
sdfg
sdf

Звёздочка здесь найдётся, а нужно, чтобы она находилась только в строке, в которой она одна.
MikeSh
 
Posts: 14
Joined: Wed, 30 Dec 2015, 17:29

Re: Сравнение строк

Postby dothen » Tue, 12 Jan 2016, 22:02

Code: Select all
#( Test
NoActive
SingleInstance
: xfile  S" DropBox" ENV S" \nnc\" S+ CUR-TASK-NAME S+ FILE ;
: -CompName  S" /^|\n-" S" ComputerName" ENV S+ S" \r|$/i" S+ ;
: CompName*  S" /^|\n(" S" ComputerName" ENV S+ S" )|(\*)\r|$/i" S+ ;
Action:
 xfile -CompName RE-MATCH
 IF
   S" Имя компьютера " S" ComputerName" ENV S+ S"  Исключено!." S+  MsgBox
 ELSE
     xfile CompName* RE-MATCH
     IF
       S" Имя компьютера " S" ComputerName" ENV S+ S"  есть в списке." S+  MsgBox
     THEN
 THEN
)#

Тут простой поиск не стоит использовать.
Code: Select all
Comp1
MyComp12345
Last edited by dothen on Thu, 14 Jan 2016, 21:50, edited 1 time in total.
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Сравнение строк

Postby MikeSh » Wed, 13 Jan 2016, 10:08

В таком виде нет вообще никаких сообщений
Пробовал перезапускть крон
MikeSh
 
Posts: 14
Joined: Wed, 30 Dec 2015, 17:29

Re: Сравнение строк

Postby MikeSh » Wed, 13 Jan 2016, 13:36

Я вообще перестал чего-либо понимать....
кронтаб
Code: Select all
#CRONTAB FILE
# Classic crontab format:
# Minutes Hours Days Months WeekDays Years Command
# see 'example.tab'


#( Test
NoActive
SingleInstance
Action:

MSG: "0"

 S" DropBox" ENV S" \nnc\" S+ CUR-TASK-NAME S+ FILE
 S" /^-" S" ComputerName" ENV S+ S" $/i" S+ RE-MATCH
 IF
   S" Имя компьютера " S" ComputerName" ENV S+ S"  Исключено!." S+ MsgBox
   EXIT
 THEN

MSG: "1"

 S" DropBox" ENV S" \nnc\" S+ CUR-TASK-NAME S+ FILE
 S" /^(" S" ComputerName" ENV S+ S" )|(\*)$/i" S+ RE-MATCH
 IF
   S" Имя компьютера " S" ComputerName" ENV S+ S"  есть в списке." S+  MsgBox
 THEN

MSG: "2"
)#


Файл D:\DropBox\nnc\Test
Code: Select all
dsfdsf
sdf
wer
sdfg
sdf
-comp1




При выполнении задания появляются только сообщения 0, 1 и 2
Раньше хотя бы первая часть работала нормально...

%computername% = Comp1

Пример, когда задание должно выполниться
Code: Select all
cdf
sldkj
comp1
-acomp1
wejrh

Нет -comp1 и есть comp1

Пример, когда задание должно выполниться
Code: Select all
cdf
sldkj
*
-acomp1
wejrh

Нет -comp1 и есть *

Во всех остальных случаях задание выполняться не должно
Несколько примеров

Пример, когда задание не должно выполниться
Code: Select all
cdf
sldkj
comp1
-comp1
wejrh

Условие с "-" проверяется первым

Тут тоже не должно выполниться
Code: Select all
cdf
sldkj
аcomp1
wejrh

т.к. нет ни, * ни comp1

Тут не выполняется, т.е. строка, в которой *, содержит пробел, а comp1 нет в списке
Code: Select all
cdf
sldkj
 *
аcomp1
wejrh


Самый распространённый пример, такой же как первый
Code: Select all
*
-comp1

Есть -comp1 - задание не выполняется.
MikeSh
 
Posts: 14
Joined: Wed, 30 Dec 2015, 17:29

Re: Сравнение строк

Postby VoidVolker » Wed, 13 Jan 2016, 15:07

MikeSh wrote:
VoidVolker wrote:А зачем регулярное выражение, если там все равно простой поиск?

Опять же это не решает проблему поиска строки целиком
Code: Select all
dsfdsf
sdf
wer
fg            *
sdfg
sdf

Звёздочка здесь найдётся, а нужно, чтобы она находилась только в строке, в которой она одна.

Code: Select all
S" DropBox" ENV S+ S" \nnc\" S+ CUR-TASK-NAME S+ FILE
CRLF S" ComputerName" ENV CRLF S+ S+
SEARCH IF
    2DROP
    \ Найдена строка ComputerName
    <.....>
ELSE
    CRLF S" *" CRLF S+ S+
    SEARCH NIP NIP IF
        \ Найдена строка *
        <.....>
    THEN
THEN

Если файл с юниксовыми переводами строк - то заменить переводы строк на юниксовые. Поиск через регулярные выражения осуществляется так:
Code: Select all
S" DropBox" ENV S+ S" \nnc\" S+ CUR-TASK-NAME S+ FILE
S" /.*(\n|^)(" ComputerName S+ S" )|(\*)(\r|$).*/s" S+ RE-MATCH IF
    <.....>
THEN
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Сравнение строк

Postby MikeSh » Wed, 13 Jan 2016, 15:23

SERARCH - это какое-то спец.слово или опечатка?

Как привести к функционалу

Code: Select all
Если нашлось -comp1 Тогда
  Выход
ИначеЕсли (нашлось *) или (нашлось comp1) Тогда
  Действие
Иначе
  Выход
КонецЕсли


Простите за синтаксис.
Не могу перестроиться на фортовский...
MikeSh
 
Posts: 14
Joined: Wed, 30 Dec 2015, 17:29

Re: Сравнение строк

Postby MikeSh » Thu, 14 Jan 2016, 09:47

Вопрос снимается, всем спасибо за ответы.
Не буду себя мучить, т.к. "обратную" логику работы и синтаксис форта мне быстро не осилить, и соответственно обслуживать эти скрипты без помощи не получится.
От крона возьму только то, на что и рассчитывал в самом начале - динамическую подргузку кронтаба без остановки сервиса. Возможно ещё SingleInstance.
Остальные задачи буду решать через скрипты vbs, с которыми дружу гораздо лучше.

Ещё раз всем спасибо за ответы. Топик можно закрыть.
MikeSh
 
Posts: 14
Joined: Wed, 30 Dec 2015, 17:29

Re: Сравнение строк

Postby VoidVolker » Thu, 14 Jan 2016, 10:13

Да ладно, зачем сдаваться так быстро? ннКрон - мощнейший автоматизатор для винды. А чем вышеприведенное мною решение не устраивает?
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Сравнение строк

Postby dothen » Thu, 14 Jan 2016, 22:15

Исправил предыдущий пример, теперь работает.

Code: Select all
CRLF S" искомоеимя" CRLF S+ S+ SEARCH
Не найдёт первую и последнюю строку.

Если делать без регулярных выражений, то наверно лучше делать сравнение COMPARE или ICOMPARE как предлагалось выше.
Пример:
Code: Select all
#( Test
NoActive
SingleInstance
Action:
 S" DropBox" ENV S" \nnc\" S+ CUR-TASK-NAME S+ FOR-FILE-LINES
    FOUND-LINE S" -" S" ComputerName" ENV S+ ICOMPARE 0=
    IF
      S" Имя компьютера " S" ComputerName" ENV S+ S"  Исключено!." S+  MsgBox
      LINE-EXIT \ Выйти из цикла.
    ELSE
      FOUND-LINE S" ComputerName" ENV ICOMPARE 0=
      FOUND-LINE S" *" ICOMPARE 0= OR
      IF
        S" Имя компьютера " S" ComputerName" ENV S+ S"  есть в списке." S+  MsgBox
      LINE-EXIT \ Выйти из цикла.
      THEN
    THEN
 ;FOR-FILE-LINES
)#
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Сравнение строк

Postby VoidVolker » Fri, 15 Jan 2016, 13:55

dothen wrote:Не найдёт первую и последнюю строку.

Да это-то понятно. Просто привел как пример реализации. А чуть ниже уже добавил правильное регулярное выражение.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Сравнение строк

Postby ANR Daemon » Tue, 26 Apr 2016, 02:37

MikeSh wrote:Выглядит красиво...

Дебильнее аргумента я не слышал.
Регэкспы это МЕДЛЕННО.
Если есть возможность не поступаясь читаемостью кода сделать то же самое БЕЗ RE, лучше это сделать без RE.
ANR Daemon
 
Posts: 234
Joined: Mon, 26 Feb 2007, 22:59

Previous

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 2 guests