Если wsf-файл содержит несколько заданий, использующих одинаковые объекты, функции, процедуры, константы, можно выделить их (функции, процедуры…) в отдельное задание и вызывать его как вспомогательный компонент. Для взаимодействия между заданиями можно использовать передачу ссылки через временное невидимое окно Internet Explorer (конечно, если в сценарии используется окно IE для создания пользовательского интерфейса, разумнее будет воспользоваться им). При этом самым простым будет передавать (на JScript) вызвавшему заданию ссылку на глобальный объект вспомогательного — все определённые во вспомогательном задании переменные и подпрограммы будут доступны как его свойства и методы.
<package>
<job id='job1'>
<script language='JScript'>
var IE=new ActiveXObject("InternetExplorer.Application");
IE.Navigate("about:blank"); while (IE.Busy) WScript.Sleep(100);
IE.Document.Script.name="mailbox";
var job3=createComponent("job3");
job3=IE.Document.Script.job3;
IE.Document.Script.job3=null; IE.Quit(); delete IE;
</script>
<script language='VBScript'>
WScript.Echo "7! = " & job3.Factorial(7)
WScript.Echo "job3.t = " & job3.t
</script>
</job>
<job id='job2'>
<script language='JScript'>var job2=this;</script>
<script language='VBScript'>
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate("about:blank"): While IE.Busy: WScript.Sleep 100: Wend
IE.Document.Script.name = "mailbox"
'Set job3 = createComponent("job3")
job2.eval("createComponent('job3')")
Set job3 = IE.Document.Script.job3
'Set IE.Document.Script.job3 = Nothing
IE.Quit: Set IE = Nothing
WScript.Echo "7! = " & job3.Factorial(7)
WScript.Echo "job3.t = " & job3.t
</script>
</job>
<job id='job3'>
<script language='VBScript'>
Const t = 10
Function Factorial(N)
Factorial = 1
For I = 1 To N: Factorial = Factorial * I: Next
End Function
</script>
<script language='JScript'>
(function () {
var t=11;
var ShellWindows=(new ActiveXObject("Shell.Application")).Windows();
for (var i=ShellWindows.Count; --i>=0;)
try {
var Script=ShellWindows.Item(i).Document.Script;
if (Script.name=="mailbox") {Script.job3=this; return;}
} catch (Err) {}
})();
</script>
</job>
</package>
В приведённом примере job3 — вспомогательное задание, предоставляющее константу t=10 и функцию для вычисления факториала; job1 и job2 — задания, использующие job3 (для вызова job2 необходимо указывать параметр //job:job2, оно делают то же, что и job1, и создано лишь для показа некоторых особенностей, связанных с использованием VBScript).
• Самое важное! Обратим внимание на строку 8:
var job3=createComponent("job3");
— кажется, что в этом месте нет смысла вызывать createComponent() как функцию, т.к. возвращаемое ей значение не используется и теряется уже при выполнении следующего оператора (можно сделать, например, так:
var temp=createComponent("job3"); delete temp;
и даже так:
try {delete createComponent("job3");} catch (e) {}
). Но, если её заменить на
при попытке получить какое либо свойство объекта job3 возникает ошибка, — по видимому, в таком случае они уничтожаются при завершении задания job3. Это является намёком на то, что, возможно, возвращаемое значение не так бесполезно, и если знать, как с ним работать, не пришлось бы прибегать ко всей этой акробатике.
• На VBScript (задание job2) результат оказывается отрицательным как при вызове createComponent() как процедуры, так и как функции. Поэтому, вместо закомментированной строки 28 пришлось призвать на помощь JScript: в строке 29 с помощью JScript-функции eval() вызывается интерпретатор JScript.
• Для того, чтобы не загромождать основной код вопросами установления взаимодействия между заданиями, можно JScript-сценарий из job1 выделить в отдельный файл и включать его (с помощью тега <script> с атрибутом src) в начало кода всех заданий использующих вспомогательное. Так же в отдельный файл можно выделить JScript-сценарий из job3 (его можно вставлять как в начале, так и в конце).
• Для временного невидимого окна IE вместо "mailbox" надёжнее будет использовать сгенерированное случайным образом имя и передавать его через переменную окружения.
• В job3 сценарий (на JScript) установления взаимодействия между заданиями выполнен в виде вызова анонимной функции, чтобы определённые в нём переменные остались локальными по отношению к сценарию.
Благодарность за разъяснения - wisgest.
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.