A Windows Scripting Host (WSH) Az egyik leghatékonyabb JavaScript végrehajtási környezet Használható Önállóan Böngészőben Kiszolgáló oldalon Hatékonyságát a nagyszámú hozzáférhető objektumnak köszönheti: WSH beépített objektumok Runtime könyvtár objektumai ActiveX objektumok ADO objektumok, stb. Tárgyalás: csak a legszükségesebbekre kitérve Dokumentáció: js6\script56.chm Hatékonyság demonstrálása Hozzáférés egy adatbázishoz, önálló alkalmazás (js6/dbase.js) js6\dbase.bat var ws = WScript.CreateObject("WScript.Shell"); var cd = ws.currentdirectory; conn.open("driver={microsoft Access Driver (*.mdb);dbq=" + cd + "\\db1.mdb"); var s =" \n"; s += "Név \t\t Életkor\n"; s +=" \n"; s +=rs("name") +"\t"+rs("age")+ "\n"; s +=" \n"; File olvasása, önálló alkalmazás (js6/fileread.js) js6\fileread.bat var fso, f; var ForReading = 1; fso = new ActiveXObject("Scripting.FileSystemObject"); f = fso.opentextfile("fileread.js", ForReading); WScript.Echo(f.ReadAll()); Hozzáférés adatbázishoz a böngészőből js6\dbase1.bat js6\dbase2.bat <html> <style type=text/css> th,td {font-size:32; font-weight:bold; th {color:yellow; background-color:black </style> <script> conn.open( "DRIVER={Microsoft Access Driver (*.mdb);dbq=db1.mdb"); document.write( "<table border=1><tr><th>név</th><th>életkor</th></tr>"); document.write("<tr><td>" + rs("name") + "</td>" + "<td>" + rs("age") + "</td></tr>"); document.write("</table>"); </html> 1
Végrehajtás WSript.exe foo.js : GUI elemekkel dialógusablakokban támogatott végrehajtás és megjelenítés. De munkaasztalról kattintással is elindítható a szkript. CScript.exe foo.js : DOS ablakban, parancssoros végrehajtás. A legalapvetőbb feladatok Olvasás a DOS ablakban (csak CScript.exe esetén használható) Írás DOS ablakban (csak CScript.exe esetén használható Olvasás input boxból Írás popup ablakban Környezeti változók olvasása Szövegfájlok megnyitása, írása és olvasása Adatbázis kapcsolat létrehozása, sql utasítások végrehajtása Hipetrext (hta) alkalmazások Olvasás a DOS ablakban (csak CScript.exe esetén használható) A WScipt objektumstdin tulajdonságának Read(n), ReadLine() és ReadAll() metódusaival // n karakter olvasása var str1 = WScript.StdIn.Read(n); // egy sor olvasása var str2 = WScript.StdIn.ReadLine(); // olvasás a stream végéig var str3 = WScript.StdIn.ReadAll(); // sorvég érzékelése karakterenkénti olvasáskor WScript.StdIn.AtEndOfLine // stream végének érzékelése WScript.StdIn.AtEndOfStream Írás a DOS ablakban (csak CScript.exe esetén használható) A WScipt objektumstdout tulajdonságának Write(str), WriteLine(str) és WriteBlankLines(n) metódusaival // az str string kiírása a DOS ablakba // az str string kiírása a DOS ablakba újsor karakterrel kiegészítve WScript.StdOut.WriteLine(str); // n üres sor kiírása a DOS ablakba WScript.StdOut.WriteBlankLines(n); A WScript.Echo(str) is használható. Ha a szkript a CScript.exe paranccsal lett elindítva, akkor ez a metódus a DOS ablakba ír ki, WScript.exe indítás esetén viszont egy popup ablakba js6\5.bat Példák az írásra és olvasásra // egy sor karakterenkénti olvasása és visszaírása js6\2.bat var input = WScript.StdIn; var out = WScript.StdOut; var s= ""; while (!input.atendofline) { s += input.read(1); out.write(s); // olvasás a stream (CTRL C) végéig, s a beolvasott // string visszaírása js6\3.bat var input = WScript.StdIn; var out = WScript.StdOut; var s= ""; while (!input.atendofstream) { s = input.readline(); out.writeline(s); // vagy egyszerűbben js6\4.bat var s = input.readall(); out.write(s); 2
Írás a popup ablakba (csak WScript.exe índítás esetén) Egymást követő Echo() metódusok újabb popup ablakokat nyitnak meg. Soremelés a \n szekvenciával váltható ki a stringen belül. // az srt string kiírása egy popup ablakba WScript.Echo(str); Olvasás popup ablakból. js6\6wsf.bat A JScriptben nincs input box, ezért a VBSript-et kell erre használnunk. Ekkor viszont a fájl kiterjesztése már nem.js, hanem.wsf. <job id= VBSandJS > <script language= VBScript > DIM Input Input = InputBox( Adja meg a nevét! ) <script language= JScript > WScript.Echo( Üdvözlöm kedves + Input); </job> Környezeti változók olvasása Az operációs rendszer környezeti változóinak olvasása js6\env1.js js6\env2.js var ws = WScript.CreateObject( WScript.Shell ); var SysEnv = ws.environment( SYSTEM ); var s = A Windows könyvtár helye: + SysEnv( WINDIR ); Egy process, például egy CGI processz környezeti változóinak olvasása var ws = WScript.CreateObject( WScript.Shell ); var ProcEnv = ws.environment( PROCESS ); var contentlength = ProcEnv( CONTENT_LENGTH ); var contenttype = ProcEnv( CONTENT_TYPE ); var querystring = ProcEnv( QUERY_STRING ); var servername = ProcEnv( SERVER_NAME );... Szekvenciális hozzáférés szövegfájlokhoz a futásidejű könyvtár FileSystemObject objektumával létrehozott TextStream objektum metódusaival // a FileSystemObject létrehozása var fso = new ActiveXObject("Scripting.FileSystemObject"); // szövegfájl megnyitása, azaz a TextStream objektum // létrehozása // filename a megnyitandó fájl neve // iomode = 1 megnyitás olvasásra // 2 megnyitás írásra // 8 megnyitás hozzáfűzésre // create = false nem létező fájlt nem hoz létre // true nem létező fájlt létrehozza // format = TristateFalse megnyitás ASCII kódolással // TristateTrue megnyitás Unicode kódolással // TristateDefault megnyitás a rendszer kódolásával var ts = fso.opentextfile(filename,iomode,create,format); Az olvasás és írás végrehajtása // n karakter olvasása ts.read(n) // egy sor olvasása (de a sorvég karaktert nem adja vissza) ts.readline() // a teljes TextStream olvaása ts.readall() // az str string írása ts.write(str) // az str string írása újsor karakterrel kiegészítve ts.writeline(str) // n üres sor írása ts.writeblanklines(n) // a megnyitott TextStream (szövegfájl) lezárása ts.close(); 3
Példa fájl írására és olvasására js6\6.bat function GetEverything() { var fso, f; var ForReading = 1, ForWriting = 2; fso = new ActiveXObject("Scripting.FileSystemObject"); f = fso.opentextfile("c:\\testfile.txt", ForWriting, true); f.write("jó napotkollegák!"); f.write("üvözlöm Önöket!"); f.close(); f = fso.opentextfile("c:\\testfile.txt", ForReading); return(f.readall()); WScript.Echo(GetEverything()); Gyermekrocessz indítása, szülő-gyermek kommunikáció I. js6\p12.bat var wshout = WScript.StdOut; var wshin = WScript.StdIn; wshout.write("adja meg az elso szamot: "); var nr1 = wshin.readline(); wshout.write("adja meg a masodik szamot: "); var nr2 = wshin.readline(); var WshShell = new ActiveXObject("WScript.Shell"); var oexec = WshShell.Exec("java.exe BigIntMult"); oexec.stdin.write(nr1 + "\n"); oexec.stdin.write(nr2 + "\n"); var result=oexec.stdout.readline(); WScript.Echo(nr1 + " * " + nr2 + " = " + result); Gyermekrocessz indítása, szülő-gyermek kommunikáció II. js6\processes\p111.bat // main.js var sh = WScript.CreateObject("WScript.Shell"); var x1='elso'; var x2='masodik'; var x3='harmadik'; var child1 = sh.exec("proc.bat "+ x1 +" "+x2+" "+x3); var str = child1.stdout.readall(); var y1='first'; var y2='second'; var y3='third'; var child1 = sh.exec("proc.bat "+ y1 +" "+y2+" "+y3); var str = child1.stdout.readall(); Gyermekrocessz indítása, szülő-gyermek kommunikáció II. (folyt) //proc.bat echo off set param1=%1 set param2=%2 set param3=%3 cscript //nologo child.js //child.js var ws = WScript.CreateObject('WScript.Shell'); var env = ws.environment('process'); WScript.StdOut.Write('Az olvasott kornyezeti valtozok\n'); WScript.StdOut.Write(env('param1')+'\n'); WScript.StdOut.Write(env('param2')+'\n'); WScript.StdOut.Write(env('param3')+'\n'); 4
Az ActiveX Data Object (ADO) használata adatbázis műveletekre Kapcsolatfelvétel az adatbázissal SQL utasítások elküldése az adatbázisba A visszakapott információ fogadása és feldolgozása A kapcsolat lezárása Kapcsolatfelvétel az adatbázissal ODBC és DSN használata // vagy // conn = new ActiveXObject( ADODB.Connection ); conn.open( custom_dns ); DNS használata nélkül // vagy // conn = new ActiveXObject( ADODB.Connection ); conn.open( DRIVER={Microsoft Access Driver (*.mdb); + DBQ=d:\\2005_web_eloadas\\wsh\\db1.mdb ); Nem Access adatbázisokra // Oracle DRIVER={Microsoft ODBC Driver for Oracle; + Server=OracleServer.world;Uid=demo;Pwd=demo // SQL DRIVER={SQL Server; + Server=myserver;Database=pubs;Uid=sa;Pwd=pwd //... SQL utasítások elküldése, feldolgozás és a kapcsolat lezárása // A Connection objektum létrehozása // A kapcsolat megnyitása conn.open( custom_dns ); // Az sql utasítás elküldése, a visszakapott eredmény egy // RecordSet objektum var rs = conn.execute( SELECT * FRM Customers ); // A RecordSet objektum feldolgozása var s = ; s += rs( Name ) +, + rs( Age ) + \n ; // Az eredmény megjelenítése // A kapcsolat lezárása Hipertext (HTA) alkalmazások (js6\dbase1.bat) html, htm helyett hta kiterjesztés biztonsági korlátozások feloldása <html> <style type=text/css> th,td {font-size:32; font-weight:bold; th {color:yellow; background-color:black </style> <script> conn.open( "DRIVER={Microsoft Access Driver (*.mdb);dbq=g:db1.mdb"); document.write( "<table border=1><tr><th>név</th><th>életkor</th></tr>"); while(!rs.eof) {document.write("<tr><td>" + rs("name") + "</td>" + "<td>" + rs("age") + "</td></tr>"); document.write("</table>"); </html> 5