2010-06-16 16 views
11

Sto scrivendo alcuni script sul lato server usando JScript e WSH. Gli script stanno diventando piuttosto lunghi e alcune funzioni e variabili comuni si adatterebbero meglio in uno script di libreria generale che ho incluso nelle varie istanze di script.Come fare riferimento a un file JScript da un altro?

Tuttavia, non riesco a trovare un modo per fare riferimento a un file JScript da un altro. Per un momento, ho letto il contenuto del file e il passaggio a eval() potrebbe funzionare. Ma, come si dice su MSDN:

Si noti che le nuove variabili o tipi definiti nell'istruzione eval non sono visibili al programma che lo contiene.

C'è un modo per includere/fare riferimento a un file JScript da un altro?

+0

* "Si noti che le nuove variabili o tipi definiti nell'istruzione eval non sono visibili al programma che lo include." * Non per quanto posso dire, almeno non per WSH: http://stackoverflow.com/a/ 19747677/157247 –

risposta

7

OK, ho trovato una soluzione decente:

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

creo un oggetto a cui posso attaccare le mie funzioni di libreria. In questo modo, posso raggiungere il codice definito nella mia libreria dallo script chiamante. Non perfetto, ma abbastanza accettabile.

Sarebbe bello vedere una soluzione più adeguata :-)

10

Provare a usare un Windows Script File. È fondamentalmente un documento XML che consente di includere più file di script e definire più lavori, tra le altre cose.

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

Ottima idea, grazie! Ma penso che continuerò per il momento. Sembra meno fastidio del file WSH –

+0

Molto bello! Ora devo solo aspettare che la scatola su cui è in esecuzione sia aggiornata. È ancora in esecuzione su WSH 5.7 ...: \ Questa funzione è stata apparentemente implementata solo in 5.8 – exhuma

+1

Ritengo che si debba notare che questo rende il debugging senza Visual Studio un po 'più complesso. – bshacklett

7

Sulla base della soluzione di Thomas - ecco un approccio simile, ma più modulare. In primo luogo, lo script per chiamare (scusate il mio stile di codifica):

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

Poi, nello script chiamante:

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

biblioteche definite in questo modo non produrre o affidamento su qualsiasi upvalues, ma la eval restituirà qualsiasi valore ricevuto dalla funzione anonima circostante nella libreria.

Problemi correlati