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

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

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

Postby MikeSh » Wed, 30 Dec 2015, 17:39

Добрый день.
Мне требуется сделать задачу, которая бы выполнялась только на определённых компьютерах.
Ничего умного в голову не приходит, кроме как такой конструкции
В каталоге "c:\nnc\" находится файл "test"

Code: Select all
#( test
  Action:
FOR-FILE-LINES: "c:\nnc\%CUR-TASK-NAME%"
\ А вот тут должно происходить сравнение текущей строки из файла и имени компьютреа
;FOR-FILE-LINES
\ Действие, если имя компьютера нашлось.
)#

Я застрял. Скорее всего, на какой-то ерунде.
Конструкция
Code: Select all
  FOUND-LINE %ComputerName% SEARCH
  IF
    FOUND-LINE MsgBox
  THEN


не работает. Равно как и другие с упоминанием %ComputerName%

Подскажите направление, пожалуйста.

Заранее спасибо.
MikeSh
 
Posts: 14
Joined: Wed, 30 Dec 2015, 17:29

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

Postby VoidVolker » Wed, 30 Dec 2015, 18:49

Code: Select all
#( Задача_184430122015
NoActive
SingleInstance
Action:
    FOR-FILE-LINES: "c:\nnc\%CUR-TASK-NAME%"
        S" ComputerName" ENV FOUND-LINE SEARCH IF
            ." Найдена строка: " TYPE CR
        ELSE
            2DROP
        THEN
    ;FOR-FILE-LINES
)#


MikeSh wrote:Мне требуется сделать задачу, которая бы выполнялась только на определённых компьютерах.


Code: Select all
#( Задача_184730122015
NoActive
SingleInstance
Rule: S" ComputerName" ENV S" Определенный компьютер" COMPARE 0= ;
Action:
." Задача вполнена"  CR
)#
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

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

Postby MikeSh » Thu, 31 Dec 2015, 09:45

Спасибо!
Сложно перестроиться на новый синтаксис...
Я изменил ваш код, получилось так
Code: Select all
#( Test
NoActive
SingleInstance
Action:
    FOR-FILE-LINES: "c:\nnc\%CUR-TASK-NAME%"
        S" ComputerName" ENV FOUND-LINE SEARCH IF
          MsgBox
        THEN
    ;FOR-FILE-LINES
)#


Оно показывает имя компьютера, но дальше появляется ошибка: Test: Action: stack error.
Листинг файла c:\nnc\Test
Code: Select all
MIKEL
dsfdsf
sdf
wer


Upd.
Ещё интересует вопрос, как сравнить использовать вот это
Code: Select all
S" ComputerName" ENV FOUND-LINE SEARCH

без учёта регистра?
MikeSh
 
Posts: 14
Joined: Wed, 30 Dec 2015, 17:29

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

Postby Aveiro » Thu, 31 Dec 2015, 13:32

Code: Select all
#( COMPUTER_NAME                                                                     
SingleInstance
NoActive
Action:   
S" COMPUTERNAME" ENV S" ASUS" COMPARE 0=            \ проверка какой это компьютер
IF                                                                                   
    MSG: "Это ASUS"       
ELSE                                                                                 
    MSG: "Это НЕ ASUS"     
THEN
)#
nncron.exe v 1.93b15 Build 1177 08.02.2016
tm.exe v 1.93b15 Build 604 08.02.2016
Aveiro
 
Posts: 222
Joined: Tue, 06 Jul 2010, 21:19

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

Postby dothen » Thu, 31 Dec 2015, 14:32

Code: Select all
#( Test
NoActive
SingleInstance
Action:
 S" c:\nnc\" 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
)#


Так не правильно
Code: Select all
S" ComputerName" ENV FOUND-LINE SEARCH

Надо так:
Code: Select all
 FOUND-LINE S" ComputerName" ENV SEARCH
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

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

Postby VoidVolker » Thu, 31 Dec 2015, 16:35

MikeSh wrote:Сложно перестроиться на новый синтаксис...Я изменил ваш код, получилось так

Ничего нового.
MikeSh wrote:Я изменил ваш код, получилось так

И получилось неправильно. Правильный вариант приведен выше.
MikeSh wrote:Ещё интересует вопрос, как сравнить использовать вот это без учёта регистра?

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

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

Postby MikeSh » Thu, 31 Dec 2015, 20:35

dothen wrote:
Code: Select all
#( Test
NoActive
SingleInstance
Action:
 S" c:\nnc\" 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
)#


Суперэлегантное решение!
Я немного изменил его
Code: Select all
 S" /(" S" ComputerName" ENV S+ S" )|(\*)/i" S+ RE-MATCH

Т.е. добавил возможность "для всех" по звёздочке. Теперь в точности, что доктор прописал.

Спасибо всем! Ну и с Новым Годом!

Осталось только понять, почему постоянно появляется ошибка
Code: Select all
Test: Action: stack error.
Скрин http://c2n.me/3srOLc7
Мне кажется, это уже что-то системное...
MikeSh
 
Posts: 14
Joined: Wed, 30 Dec 2015, 17:29

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

Postby dothen » Fri, 01 Jan 2016, 04:22

Поздравляю всех с новым 2016 годом!

Да SEARCH найдёт "name" в строке "name1" или "qwertynameee" ...
Тут надо использовать регулярные выражения.

Code: Select all
S" /\s" S" ComputerName" ENV S+ S" \s/i" S+ RE-MATCH

MikeSh wrote:... добавил возможность "для всех" по звёздочке.


Т.е. "для всех", если в списке есть искомое имя,
или просто для всех имён в списке,
или для совсем всех всех? :)
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

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

Postby MikeSh » Mon, 11 Jan 2016, 10:33

Прошу ещё раз помочь с синтаксисом
Опишу ситуацию
У компьютера есть глобальная переменная %DropBox%, которая ссылается на папку C:\DropBox
Там есть папка nnc
В ней файл cron.tab и ещё несколько файлов, которые соответствуют %CUR-TASK-NAME% для задания.
Нужно, чтобы при запуске задания "Test", просматривался файл "%DropBox%\nnc\Test" на предмет наличия строки, равной %ComputerName% или "*"
Если строка найдена, задание выполняется дальше, если не найдена, то выход из задания
Code: Select all
#( Test
NoActive
SingleInstance
Action:
 S" DropBox" ENV S+ 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
)#

Этот код не работает. Пожалуйста, помогите исправить.
Заранее спасибо.
MikeSh
 
Posts: 14
Joined: Wed, 30 Dec 2015, 17:29

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

Postby dothen » Mon, 11 Jan 2016, 20:15

Может так:
Code: Select all
#( Test
NoActive
SingleInstance
Action:
 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
)#
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

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

Postby MikeSh » Tue, 12 Jan 2016, 08:32

Да! Заработало!
Спасибо )
MikeSh
 
Posts: 14
Joined: Wed, 30 Dec 2015, 17:29

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

Postby MikeSh » Tue, 12 Jan 2016, 09:25

В итоге получилась такая конструкция:
Code: Select all
#( Test
NoActive
SingleInstance
Action:
 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

 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
)#

при запуске задания проверяется файл "%DropBox%\nnc\Test"
Если в нём находится строка
-%ComputerName%,
то значит дальше ничего делать не надо.
Если не находится, то идёт проверка на "%ComputerName%" и "*"
В первом случае используется точное совпадение
/^-%ComputerName%$/i
А вот во втором случае, как бы я не подставлял ^ и $ - не срабатывает. И внутри скобок, и за скобками, и вместо скобок... А без них ищет и "lskjdfhk*", и "%ComputerName%sdfgsdf".
Можно, конечно, отказаться от * и привести второй вариант к первому, тогда заработает, но теряется, скажем так, универсальность.
MikeSh
 
Posts: 14
Joined: Wed, 30 Dec 2015, 17:29

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

Postby VoidVolker » Tue, 12 Jan 2016, 12:12

Code: Select all
S" DropBox" ENV S+ S" \nnc\" S+ CUR-TASK-NAME S+ FILE
S" ComputerName" ENV
SEARCH IF
    2DROP
    \ ComputerName найдено
    <.....>
ELSE
    S" *" SERARCH NIP NIP IF
        \ * Найдено
        <.....>
    THEN
THEN
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

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

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

Хотелось бы через regexp, чтобы стиль не нарушать
Как-то так
Code: Select all
S" /^(" S" ComputerName" ENV S+ S" )|(\*)$/i" S+ RE-MATCH

или так
Code: Select all
S" /(^" S" ComputerName" ENV S+ S" $)|(^\*$)/i" S+ RE-MATCH

или ещё какие варианты, т.к. эти два не срабатывают
MikeSh
 
Posts: 14
Joined: Wed, 30 Dec 2015, 17:29

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

Postby VoidVolker » Tue, 12 Jan 2016, 13:05

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

Next

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 3 guests

cron