Вызов суб-скрипта

Russian main discussion
Post Reply
  • Author
  • Message
Offline
Posts: 7
Joined: Sun Oct 30, 2016 7:12 pm

Вызов суб-скрипта

Post by ilia »

Есть два скрипта, один вызывается из другого.
Вот они:

Code: Select all

//test_main.js
// test main-script

var nCode =0;
var i = 0;

main();

function main()
{
	for (i=0;i<5;++i)
	{
	WScript.Echo("call #" + i );
	nCode=AkelPad.Call("Scripts::Main",     1     , "test_sub1.js", " -Code=" + i);
	}
}



Code: Select all

//test_sub1.js
// test sub-script
//return arg

var nCode1 =0;

main1();

function main1()
{
	nCode1 = AkelPad.GetArgValue("Code", 255);
	WScript.Echo("-- Inside " + nCode1);
}


код вызова основного скрипта из кнопки на тулбаре:

Code: Select all

Call("Scripts::Main",  1  ,"test_main.js")
Внимание, вопрос:
Хочу вызвать скрипт, дождаться его окончания, получить из него код возврата (если я правильно понимаю смысл метода AkelPad.ScriptExitCode(nCode) ) и продолжить в зависимости от результата.
Пока что не получается дождаться отработки суб-скрипта.

при таком вызове получаю

Code: Select all

call #0    
call #1    
call #2    
call #3    
call #4    
-- Inside 0
-- Inside 1
-- Inside 2
-- Inside 3
-- Inside 4
Если в основном скрипте применить
AkelPad.Call("Scripts::Main", 2, "test_sub1.js", " -Code=" + i);
то суб-скрипт своеобразно "виснет": в Акеле можно работать, но если нажать Esc, происходит дальнейшее исполнение скрипта.

Code: Select all

call #0 --> будто все закончилось, но после нажатия Esc
call #1 --> будто все закончилось, но после нажатия Esc
и тд.
call #2
call #3
call #4 --> будто все закончилось, но после нажатия Esc выход из Акеля
И собственно почему и что я делаю не так?

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

В скрипт-2 оборачиваете в функцию.
В скрипте-1 подключаем 2-й скрипт с помощью Include и вызываем функцию.

Есть вроде и js-функция, которая вызывает на выполнение скрипт, Exec вроде, но это изврат.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Ну можно ещё (eval, eval)(AkelPad.ReadFile(.....)) :lol:

Offline
Posts: 7
Joined: Sun Oct 30, 2016 7:12 pm

Post by ilia »

FeyFre wrote:Ну можно ещё (eval, eval)(AkelPad.ReadFile(.....)) :lol:
К сожалению не получается передать агрументы командной строки и получить обратно результат..

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

ilia
Вы попробовали запуск скрипта с параметром 1 и 2, почему не попробовали 4?
Не проще объединить всё в один, к чему такие сложности?

Offline
Posts: 7
Joined: Sun Oct 30, 2016 7:12 pm

Post by ilia »

VladSh wrote:В скрипт-2 оборачиваете в функцию.
В скрипте-1 подключаем 2-й скрипт с помощью Include и вызываем функцию.
В конечном итоге так и сделал.

К сожалению вызываемые скрипты очень похожи друг на друга и содержат много почти одинаковых функций, да наборы данных для обработки разные.. пришлось все функции замкнутыми сделать..
Есть вроде и js-функция, которая вызывает на выполнение скрипт, Exec вроде, но это изврат.
Да, только вот нельзя использовать AkelPad.методы() так что польза стремится к нулю..

Offline
Posts: 7
Joined: Sun Oct 30, 2016 7:12 pm

Post by ilia »

Skif_off wrote:ilia
Вы попробовали запуск скрипта с параметром 1 и 2, почему не попробовали 4?
Не проще объединить всё в один, к чему такие сложности?
Ну как же не попробовал.. попробовал.. Вообще Акел зависает. :)


Честно говоря, и не подумал бы что это "сложности".
Моя задача следующая: создать набор (или один) скриптов для обработки текстовых файлов (ЧПУ программы). Обработка каждого конкретного файла не такая уж и сложная.. Перестановки и замены. Но существует много "типов" файлов. Так, я задумал, что на каждый необходимый тип файла будет сделан свой скрипт.
Почему? Во-первых, модульность. Можно запустить данных конкретный скрипт для данного конкректного файла. Во-вторых, внутри каждого скрипта есть определенные "проверки целостности", т.е. скрипт не должен работать на "чужом" файле. В-третьих, знаю что рано или поздно из почти одинаковых поначалу скриптов получатся совсем непохожие друг на друга.. тут добавить, там изменить... )))

Вот причины почему я хочу сделать вызов одного скрипта из другого. Дочерний скрипт сам все проверит и вернет результат: "все ок" или "не мой файл" -переходим к следующему...

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

ilia
Возможно, просто баг какой-то вылез в последней версии(ях)? Предыдущие версии не пробовали?

Или что-то упускаем. Вот, например, не пригодится?

P.S. В крайнем случае результат можно и

Code: Select all

var WshShell   = CreateObject("WScript.Shell")
var WshEnvUser = WshShell.Environment("User");
var ExitCode;

ExitCode = ...;
WshEnvUser("Exit") = ExitCode;

//Первый скрипт:
...
ExitCode = WshShell.ExpandEnvironmentStrings("%Exit%")
WshEnvUser.Remove("Exit");
If ExitCode <> 0 ...
, но наверняка можно обойтись и без этого.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

ilia
Функции можно унифицировать, параметризовав и поместив в общий скрипт, который будет использоваться всеми остальными.
Можно сделать всё на классах - базовый класс с общей функциональностью и классы-наследники в разных файлах со спецификой.

Не знаю, насколько сложно определение типа файла... но можно было бы сделать вообще наоборот: в первом запускаемом файле вся логика определения типа файла, а затем от типа вызываем определённый скрипт для обработки.

Offline
Posts: 7
Joined: Sun Oct 30, 2016 7:12 pm

Post by ilia »

Skif_off wrote:ilia
Возможно, просто баг какой-то вылез в последней версии(ях)? Предыдущие версии не пробовали?

Или что-то упускаем.


Да, что-то упускаем. Спасибо большое.
Не хватало строки

Code: Select all

AkelPad.ScriptNoMutex();
в запускающем скрипте. Наверное в Scripts-Rus.txt хорошо бы это пометить..

Теперь скрипты запускаются как положено.

Еще раз спасибо.


ЗЫ. Теперь с кодом возврата разбираюсь..
P.S. В крайнем случае результат можно и через переменную окружения передать>>>, но наверняка можно обойтись и без этого.
Объясните мне, пожалуйста, что делает метод

Code: Select all

AkelPad.ScriptExitCode(nCode)
Как и где этот код возврата потом можно использовать???
Я предполагал, что вызывающий скрипт получит этот код как результат метода Call(). но на деле получал всегда 1 независимо от значения nCode.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

ilia
Что-то Вы куда-то не в ту степь...

Вот гляньте пример: OpenEx.js. Здесь и подключение скрипта и вызов функций из него, которые возвращают результат.
Здесь то же самое, но с использование классов: LineNumbersInsert.js.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

ilia
С версии 18.6 Scripts плагина можно получать результат через ScriptExitCode:

1.js

Code: Select all

AkelPad.ScriptNoMutex();
nResult=AkelPad.Call("Scripts::Main", 2 /*или 4*/, "2.js")
WScript.Echo(nResult);
2.js

Code: Select all

AkelPad.ScriptExitCode(9);

Offline
Posts: 7
Joined: Sun Oct 30, 2016 7:12 pm

Post by ilia »

Instructor wrote:ilia
С версии 18.6 Scripts плагина можно получать результат через ScriptExitCode.
God bless you!

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

У-у-х! Instructor весь блестящий ворвался на белом коне! ))) Чего-то аж на душе приятно стало :D
Post Reply