Как ссылаться на файл JScript из другого? - PullRequest
11 голосов
/ 16 июня 2010

Я пишу некоторые серверные сценарии с использованием JScript и WSH.Сценарии становятся довольно длинными, и некоторые общие функции и переменные будут лучше подходить к общему библиотечному сценарию, который я включил в свои различные экземпляры сценария.

Но я не могу найти способ ссылки на один файл JScript из другого.На мгновение я мог прочитать содержимое файла и передать его в eval().Но, как сказано в MSDN :

Обратите внимание, что новые переменные или типы, определенные в операторе eval, не видны для вмещающей программы.* Есть ли способ включить / ссылаться на файл JScript из другого файла?

Ответы [ 3 ]

10 голосов
/ 17 июня 2010

Попробуйте использовать Файл сценария Windows . По сути, это документ XML, который позволяет вам, среди прочего, включать несколько файлов сценариев и определять несколько заданий.

<!-- MyJob.wsf -->
<job id="IncludeExample">
  <script language="JScript" src="MyLib1.js"/>
  <script language="JScript" src="MyLib2.js"/>
  <script language="JScript">
    WScript.Echo(myLib1.foo());
    WScript.Echo(myLib2.bar());
  </script>
</job>
8 голосов
/ 24 апреля 2012

Основано на решении Томаса - вот похожий, но более модульный подход.Сначала скрипт для вызова:

/* include.js */
(function () {
    var L = {/* library interface */};
    L.hello = function () {return "greetings!";};
    return L;
}).call();

Затем в вызывающем скрипте:

var Fs = new ActiveXObject("Scripting.FileSystemObject");
var Lib = eval(Fs.OpenTextFile("include.js", 1).ReadAll());
WScript.echo(Lib.hello()); /* greetings! */

Библиотеки, определенные таким образом, не производят и не полагаются на какие-либо значения, но eval вернет любое значение, полученное от окружающей анонимной функции в библиотеке.

8 голосов
/ 17 июня 2010

ОК, я нашел достойное решение:

// A object to which library functions can be attached
var library = new Object;
eval((new ActiveXObject("Scripting.FileSystemObject")).OpenTextFile("common_script_logic.js", 1).ReadAll());

// Test use of the library
library.die("Testing library");

Я создаю объект, к которому я могу присоединить свои библиотечные функции. Таким образом, я могу получить код, определенный в моей библиотеке, из вызывающего скрипта. Не идеально, но вполне приемлемо.

Было бы здорово увидеть более правильное решение: -)

...