2010-06-16 16 views
11

Piszę niektóre skrypty po stronie serwera przy użyciu JScript i WSH. Skrypty są dość długie, a niektóre popularne funkcje i zmienne lepiej pasują do ogólnego skryptu biblioteki, który zawarłem w różnych instancjach skryptów.Jak odwołać się do pliku JScript z innego?

Ale nie mogę znaleźć odniesienia do jednego pliku JScript od drugiego. Przez chwilę czytałem zawartość pliku i przekazywałem ją do eval(). Ale, jak mówi na MSDN:

Zauważ, że nowe zmienne lub typy zdefiniowane w eval oświadczenia nie są widoczne w programie okalającego.

Czy istnieje sposób dołączenia/odniesienia do pliku JScript z innego?

+0

* "Zauważ, że nowe zmienne lub typy zdefiniowane w instrukcji eval nie są widoczne dla programu otaczającego." * Nie tak daleko, jak to możliwe, przynajmniej nie dla WSH: http://stackoverflow.com/a/ 19747677/157247 –

Odpowiedz

7

OK, znalazłem godnej rozwiązanie:

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

utworzyć obiekt, do którego można dołączyć swoje funkcje biblioteczne. W ten sposób mogę uzyskać kod zdefiniowany w mojej bibliotece ze skryptu wywołującego. Nie idealne, ale całkiem do przyjęcia.

Byłoby wspaniale zobaczyć bardziej właściwe rozwiązanie :-)

10

Spróbuj użyć Windows Script File. Jest to w zasadzie dokument XML, który umożliwia dołączanie wielu plików skryptów i definiowanie wielu zadań, między innymi.

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

Świetny pomysł, dziękuję! Ale myślę, że będę trzymać się mojego obejścia na razie. Wydaje się, że mniej kłopotów niż plik WSH –

+0

Bardzo ładne! Teraz muszę tylko poczekać, aż pole, na którym działa, zostanie uaktualnione. Wciąż działa na WSH 5.7 ...: \ Ta funkcja najwyraźniej została zaimplementowana tylko w 5.8 – exhuma

+1

Uważam, że należy zauważyć, że to sprawia, że ​​debugowanie bez Visual Studio jest nieco bardziej skomplikowane. – bshacklett

7

Na podstawie rozwiązania Thomasa - jest podobne, ale bardziej modularne podejście. Po pierwsze, skrypt zadzwonić (wybaczcie mój styl kodowania):

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

Następnie w skrypcie wywołującym:

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

Biblioteki zdefiniowane w ten sposób nie wytwarzają lub opierać się na jakimkolwiek upvalues, ale eval zwróci wartość otrzymaną z otaczającej anonimowej funkcji w bibliotece.

Powiązane problemy