2010-06-16 21 views
11

Estoy escribiendo algunas secuencias de comandos del lado del servidor usando JScript y WSH. Los scripts son cada vez más largos, y algunas funciones y variables comunes encajarían mejor en un script de biblioteca general que incluí en mis varias instancias de scripts.¿Cómo hacer referencia a un archivo JScript desde otro?

Pero no puedo encontrar una manera de referenciar un archivo JScript de otro. Por un momento, pensé en leer el contenido del archivo y pasarlo al eval() podría funcionar. Pero, como dice en MSDN:

Tenga en cuenta que las nuevas variables o tipos definidos en la declaración eval no son visibles para el programa adjunto.

¿Hay alguna forma de incluir/referenciar un archivo JScript de otro?

+0

* "Tenga en cuenta que las nuevas variables o tipos definidos en la declaración eval no son visibles para el programa adjunto." * No es tan lejos como puedo decir, al menos no para WSH: http://stackoverflow.com/a/ 19747677/157247 –

Respuesta

7

OK, he encontrado una solución 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"); 

puedo crear un objeto al que puedo enviar mis funciones de biblioteca. De esa forma, puedo acceder al código definido en mi biblioteca desde el script de llamada. No es perfecto, pero es bastante aceptable.

Sería muy bueno para ver una solución más adecuada :-)

10

Trate de usar un Windows Script File. Básicamente es un documento XML que le permite incluir múltiples archivos de script y definir múltiples trabajos, entre otras cosas.

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

¡Gran idea, gracias! Pero creo que me atendré a mi solución por el momento. Parece menos complicado que el archivo WSH –

+0

¡Muy bueno! Ahora solo tengo que esperar hasta que se actualice la caja en la que se está ejecutando. Todavía se está ejecutando en WSH 5.7 ...: \ Esta característica aparentemente solo se ha implementado en 5.8 – exhuma

+1

Creo que debe tenerse en cuenta que esto hace que la depuración sin Visual Studio sea algo más compleja. – bshacklett

7

basado en la solución de Thomas - aquí es un enfoque modular similar, pero mucho más. En primer lugar, la secuencia de comandos para llamar (excusa mi estilo de codificación):

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

Luego, en el guión de llamada:

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

bibliotecas definidas de esta manera no producen o confiar en cualquier upvalues, pero el eval devolverá cualquier valor que reciba de la función anónima circundante en la biblioteca.

Cuestiones relacionadas