2010-06-16 3 views
11

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

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

Обратите внимание, что новые переменные или типы, определенные в описании eval, не отображаются в охватывающей программе.

Есть ли способ включить/списать JScript-файл с другого?

+0

* «Обратите внимание, что новые переменные или типы, определенные в инструкции eval, не отображаются в охватывающей программе». * Не насколько я могу судить, по крайней мере, не для WSH: http://stackoverflow.com/a/ 19747677/157247 –

ответ

7

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

// 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"); 

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

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

10

Попробуйте использовать Windows Script File. Это в основном 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> 
+0

Отличная идея, спасибо! Но я думаю, что пока буду придерживаться своего обходного пути. Кажется, что меньше хлопот, чем файл WSH. –

+0

Очень приятно! Теперь мне нужно только подождать, пока обновится окно, на котором выполняется это обновление. Он по-прежнему работает на WSH 5.7 ...: \ Эта функция, по-видимому, была реализована только в 5.8 – exhuma

+1

Я считаю, что следует отметить, что это делает отладку без Visual Studio несколько более сложной. – bshacklett

7

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

/* 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! */ 

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

Смежные вопросы