Вопрос - Ответ

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

Re: Вопрос - Ответ

Postby VoidVolker » Fri, 16 Dec 2011, 18:53

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

Re: Вопрос - Ответ

Postby Morituruz » Fri, 16 Dec 2011, 18:59

Большое спасибо! Правда придётся учитывать количество нужных знаков в конкретном случае, но это уже проще :)
User avatar
Morituruz
 
Posts: 728
Joined: Sun, 14 Oct 2007, 01:51

Re: Вопрос - Ответ

Postby VoidVolker » Fri, 16 Dec 2011, 21:51

Moriturus wrote:Правда придётся учитывать количество нужных знаков в конкретном случае, но это уже проще

Да, например, можно сделать так:
Code: Select all
S" 001" SWAP OVER S>NUM S>D <# # # # # # #> + OVER - SWAP TYPE CR
S" 02" SWAP OVER S>NUM S>D <# # # # # # #> + OVER - SWAP TYPE CR

Используем один и тот же код для строк разной длины - просто при конвертации задаем заведомо большее число разрядов и согласовывая длину итоговой строки с исходной.
О, а вот так даже лучше будет:
Code: Select all
: XN>S   \ ( x num -- a u ) \ Конвертировать x разрядов положительного числа в строку
  SWAP >R S>D <# R> 0 DO # LOOP #>
;
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2902
Joined: Tue, 25 Apr 2006, 17:56

Re: Вопрос - Ответ

Postby SphinxST » Sat, 17 Dec 2011, 17:33

Возможно ли иметь общий ccron.tab файл который выполняется на нескольких компах? И как в условии запуска задачи проверить название текущего компа?

Т.е. задумка такая. Есть набор общих задач, которые должны выпонятся на 3х различных машинах. Плюс, есть задачи для каждой машины отдельно.
Думал, может сделать общий крон файл, синхронизировать через dropbox и управлять запуском через условия задачи.
SphinxST
 
Posts: 18
Joined: Thu, 17 Nov 2011, 12:27

Re: Вопрос - Ответ

Postby VoidVolker » Sat, 17 Dec 2011, 18:36

SphinxST wrote:Возможно ли иметь общий ccron.tab файл который выполняется на нескольких компах?

Да. Например можно обычным wget раз в минуту синхронизировать табы.
SphinxST wrote:И как в условии запуска задачи проверить название текущего компа?

Code: Select all
WINAPI: GetComputerNameA kernel32.dll
: CompName  PAD 255 SP@ PAD GetComputerNameA DROP ;
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2902
Joined: Tue, 25 Apr 2006, 17:56

Re: Вопрос - Ответ

Postby AlikasS » Mon, 19 Dec 2011, 02:11

название компа еще сидит в
Code: Select all
S" COMPUTERNAME" ENV
User avatar
AlikasS
 
Posts: 1438
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Вопрос - Ответ

Postby SphinxST » Mon, 19 Dec 2011, 16:31

Да, действительно.

Как в этом случае будет выглядеть "Rule:"?
Надо записать что-то типа ("%COMPUTERNAME%" = "PC1") or ("%COMPUTERNAME%" = "PC2")
SphinxST
 
Posts: 18
Joined: Thu, 17 Nov 2011, 12:27

Re: Вопрос - Ответ

Postby Morituruz » Mon, 19 Dec 2011, 16:51

VoidVolker wrote:О, а вот так даже лучше будет:
Code: Select all
: XN>S   \ ( x num -- a u ) \ Конвертировать x разрядов положительного числа в строку
  SWAP >R S>D <# R> 0 DO # LOOP #>
;


Спасибо! Конструкция получилась длинная, но рабочая:
Code: Select all
FOUND-FULLPATH 2DUP ONLYDIR S" \" S+ backup_depth N>S SWAP DROP $0 S>NUM 1 + XN>S S+ FOUND-FILENAME backup_depth N>S SWAP DROP /STRING S+ FRENAME
или так:
FOUND-FULLPATH 2DUP ONLYDIR S" \" S+ backup_depth N>S SWAP DROP $0 S>NUM 1 + XN>S S+ FOUND-FILENAME 2DUP S" _" StringGetPos 1 - /STRING S+ FRENAME
User avatar
Morituruz
 
Posts: 728
Joined: Sun, 14 Oct 2007, 01:51

Re: Вопрос - Ответ

Postby VoidVolker » Mon, 19 Dec 2011, 18:23

SphinxST wrote:Да, действительно.

Как в этом случае будет выглядеть "Rule:"?
Надо записать что-то типа ("%COMPUTERNAME%" = "PC1") or ("%COMPUTERNAME%" = "PC2")

Code: Select all
Rule: S" PC1"  S" COMPUTERNAME" ENV  COMPARE 0= ;

В зависимости от задач, для упрощения можно в начале кронтаба сделать так(за пределами задачи):
Code: Select all
<%
: ThisPC?   \ ( a u -- )
  S" COMPUTERNAME" ENV  COMPARE 0=
;
%>

И далее в задачах:
Code: Select all
Rule: S" PC1" ThisPC? ;
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2902
Joined: Tue, 25 Apr 2006, 17:56

Re: Вопрос - Ответ

Postby VoidVolker » Mon, 19 Dec 2011, 18:25

Moriturus wrote:
Code: Select all
FOUND-FULLPATH 2DUP ONLYDIR S" \" S+ backup_depth N>S SWAP DROP $0 S>NUM 1 + XN>S S+ FOUND-FILENAME backup_depth N>S SWAP DROP /STRING S+ FRENAME
или так:
FOUND-FULLPATH 2DUP ONLYDIR S" \" S+ backup_depth N>S SWAP DROP $0 S>NUM 1 + XN>S S+ FOUND-FILENAME 2DUP S" _" StringGetPos 1 - /STRING S+ FRENAME

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

Re: Вопрос - Ответ

Postby SphinxST » Tue, 20 Dec 2011, 17:30

Спасибо, работает. Записал так:
Code: Select all
S" PC1"                  EVAL-SUBST S" OFFICE_LAPTOP_NAME"   SETENV THROW
S" PC2"                  EVAL-SUBST S" OFFICE_DESKTOP_NAME"   SETENV THROW

<%
: IS_CURRENT_PC?   \ ( a u -- )
   S" COMPUTERNAME" ENV  COMPARE 0=
;
%>

При этом, почему такое работает?
Code: Select all
Rule: S" PC1" IS_CURRENT_PC? ;

А такое - нет, ошибка в синтаксисе.
Code: Select all
Rule: %OFFICE_LAPTOP_NAME% IS_CURRENT_PC? ;

Прошу прощения за глупые вопросы. Форт не самый очевидный язык для меня...
SphinxST
 
Posts: 18
Joined: Thu, 17 Nov 2011, 12:27

Re: Вопрос - Ответ

Postby VoidVolker » Tue, 20 Dec 2011, 19:12

SphinxST wrote:Спасибо, работает. Записал так:
Code: Select all
S" PC1"                  EVAL-SUBST S" OFFICE_LAPTOP_NAME"   SETENV THROW
S" PC2"                  EVAL-SUBST S" OFFICE_DESKTOP_NAME"   SETENV THROW

<%
: IS_CURRENT_PC?   \ ( a u -- )
   S" COMPUTERNAME" ENV  COMPARE 0=
;
%>


EVAL-SUBST - не нужен.
SphinxST wrote:
Code: Select all
Rule: S" PC1" IS_CURRENT_PC? ;

А такое - нет, ошибка в синтаксисе.
Code: Select all
Rule: %OFFICE_LAPTOP_NAME% IS_CURRENT_PC? ;

В данном случае надо так:
Code: Select all
Rule: S" OFFICE_LAPTOP_NAME" ENV IS_CURRENT_PC? ;

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

Re: Вопрос - Ответ

Postby SphinxST » Wed, 21 Dec 2011, 15:06

Да, спасибо, все работает.

Еще вопрос по форту. В документации описана работа с одномерными массивами символов - стороками. А реально ли использовать многомерные? У меня для бакапа запускается множество однотипных команд. Соответственно, было бы гораздо короче опеределить массив строковых параметрои и вызывать их в цикле. Т.е. в псевдокоде что-то такое:
Code: Select all
param_array
{
  { "param11", "param12" }
  { "param21", "param22" }
  { "param31", "param32" }
  ...
}

for (int i = 0; i < param_array.size; i++)
{
   START-APPW: BACKUP_LAUNCH_CMD param_array[i][0] param_array[i][1]
}
SphinxST
 
Posts: 18
Joined: Thu, 17 Nov 2011, 12:27

Re: Вопрос - Ответ

Postby VoidVolker » Wed, 21 Dec 2011, 17:10

Да, возможно, но какого-то специального инструмента в кроне нет, т.к. оно нечасто используется. Обычно делается что-нибудь вроде такого:
Code: Select all
: str1 S" string1" ;
: str2 S" string2" ;
: str3 S" string3" ;
: str4 S" string4" ;

И по мере надобности просто вместо строк используются слова для подстановки нужных строк.
Или вот такого:
Code: Select all
0
CELL -- -Param1
CELL -- -Param2
CELL -- -Param3
CELL -- -Param4
CONSTANT /SomeStructure

0 VALUE SomeStructure

А потом используется так:
Code: Select all
/SomeStructure ALLOCATE THROW TO SomeStructure

1234 SomeStructure -Param1 !
5678 SomeStructure -Param2 !
0xABCD SomeStructure -Param3 !
0xAABBCC SomeStructure -Param4 !

Или можно сделать вот так с использованием плагина Lists:
Code: Select all
<%
GLOBAL-STRING-LIST: Params1
GLOBAL-STRING-LIST: Params2
" param1" " param2" " param3" 3 #!Params1
" param1a" " param2a" " param3a" 3 #!Params2
%>

И далее в задачах:
Code: Select all
2 0 DO
  " BACKUP_LAUNCH_CMD %Params1@% %Params2@% " START-APPW
LOOP
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2902
Joined: Tue, 25 Apr 2006, 17:56

Re: Вопрос - Ответ

Postby SphinxST » Wed, 21 Dec 2011, 20:31

Первая часть выглядит как сложночитаемая и не стоящая труда. Мне и так сейчас приходится делать что-то типа такого.
в заголовке все переменные
Code: Select all
SET P11="param11"
SET P21="param12"
SET P12="param21"
SET P22="param22"

и в задаче - запуск
Code: Select all
START-APPW: BACKUP_LAUNCH_CMD %P11% %P12%
START-APPW: BACKUP_LAUNCH_CMD %P21% %P22%

А с Lists надо покопаться. Проблема которую я вижу сразу в вашем примере, создается 1 список для первого параметра, второй - для второго и т.д. Удобно в использовании, но учитывая что каждый параметр это 20-40 символов, код заполнения списка будет нечитабелен и соответствующие параметры из разных списков будет сложно связать :(
Еще было бы здорово если б задача сама определяла длину списка.
Т.е. что я пытаюсь добиться - это код задачи статичен и полностью управляется параметрами. Требуется запустишь бакап еще на пару каталожек - добавили еще 1 элемент в список и все.

Все-таки, классические языки в этом плане удобны...
SphinxST
 
Posts: 18
Joined: Thu, 17 Nov 2011, 12:27

PreviousNext

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 2 guests