C# - Windows Script fájlok (.wsf) használata

Windows Script Host lehetőségei 3. rész

forráskód letöltése
A sorozat múlt heti számában megismert objektummodell segítségével komoly munkára foghatjuk parancsállományainkat. Elérhetjük a fájlrendszer elemeit, a hálózat erőforrásait. Mai cikkünkben megismerhetjük a parancsállományok konfigurációs állományaként is felfogható Windows Script fájlokat (.wsf), melyek segítségével lehetőség nyílik arra, hogy egy állományon belül többféle script-nyelvet használjunk egy időben.
.wsf állományok
A Windows Script állományok szöveges alapú dokumentumok, melyekben XML formátumban helyezkednek el a konfigurációs bejegyzések, valamint a futtatható kódrészletek egyaránt. Ennek eredményeképpen megnövekszik a parancsállományok rugalmassága. A formátum előnyeit egy listában foglaltuk össze:
  • Utasításokat tartalmazhat a script-ek futtatására vonatkozóan.
  • Mivel a végrehajtás nem feldolgozó-specifikus, vagyis a parancsállomány futtatásához nem szükséges egy meghatározott futtatórendszert igénybe vennünk, így a parancsállományon belül keverhetjük a script-nyelveket.
  • A parancsállomány szöveges felépítéséből adódóan könnyen szerkeszthető egy XML-szerkesztővel.
  • A parancsállományban az egyes munkamenetek jól elkülönülnek egymástól, így egy állományon belül egymás után több feladat is futtatható.
  • Lehetőség van arra, hogy bizonyos funkciókat elkülönült állományokban valósítsunk meg, és egy hivatkozást elhelyezve a parancsállományban érjük el azokat.
A parancsállományok meghatározott XML-elemekkel rendelkeznek, melyekkel az állomány logikai részekre bontható.
A <package> elem
A parancsállományok szerkezeti hierarchiájában a legfontosabb elem, melynek segítségével a „többfeladatos” állományokat összefoghatjuk. Ezen elemeken beül több alegységet elhelyezhetünk, a következő módon:
<package>
  <job id=”myJob”>
  ...
  </job>
  <job id=”yourJob”>
  ...
  </job>
</package>
A részegységek a <job></job> elempár közt helyezkednek el, mintegy logikai részekre tagolva a parancsállományt. A parancsállomány futtatásakor meghatározhatjuk, hogy melyik <job> bejegyzésen belül megvalósított script-et futtatjuk. A <job> elemekre azonosítójukkal hivatkozhatunk, például:
cscript myScript.wsf //job:myJob
A <?job?> elem
A parancsállományok hibakezelésére vonatkozó konfigurációs beállításokat tehetjük meg ebben az elemben. Szintaxisa:
<?job error="flag" debug="flag"?>
Mindkét attribútum logikai típusú. Az error attribútummal megadhatjuk, hogy jelenjen-e meg hibaüzenet, ha valamilyen természetellenes viselkedést produkál script-ünk. A debug attribútummal engedélyezhetjük a hibakezelést.
A <runtime> elem
Az elemben megadhatjuk a script futási idejű argumentumait. Szintaxisa:
<runtime>
  <named attribútumok tulajdonságai/>
  <unnamed attribútumok tulajdonságai/>
  <example>Example Text</example>
  ...
</runtime>
A futási idejű argumentumok értékét a ShowUsage metódussal olvashatjuk ki. Az <example> elemben megadhatunk a script használatával kapcsolatos instrukciókat.
Példa alkalmazás
A mellékelt alkalmazásban egy olyan parancsállományt készítünk, mely a vele azonos mappában elhelyezett, Methods.js állományban megvalósított metódusokkal lekérdez bizonyos információkat a megadott meghajtókról.
A meghajtók betűjelét a programból gyűjtjük be egy karakterlánc-tömbbe, és ennek tartalmát adjuk át egy konstans formájában a parancsállománynak. A script a Methods.js állományban megvalósított IsFixedDrive metódussal eldönti a meghajtókról, hogy merevlemezek-e. Ha igen, akkor a kigyűjtött információkat egy XML állományba írja a script, melyet az ADATBEOLVASÁS gombbal betölthetünk a DataGrid kontrolba.
A parancsállomány futtatása a PARANCSÁLLOMÁNY FUTTATÁSA gombbal indítható.
A Methods.js állományban három metódus kódját helyeztük el, melyek a szabad és teljes lemezterületet adják vissza, valamint hogy a megadott meghajtó milyen fájlrendszerrel rendelkezik. A GetFreeSpace metódus a következő:
function GetFreeSpace(drvPath)
{
   var fs, d, s;
   fs = new ActiveXObject("Scripting.FileSystemObject");
   d = fs.GetDrive(fs.GetDriveName(drvPath));
   s = d.FreeSpace/1024 + " kB";
   return s;
}
A FileSystemObject GetDrive metódusa megadja a meghajtó objektumot (Drive objektum), majd ennek FreeSpace property-jéből kiolvassuk a szabad lemezterületre vonatkozó adatot.
A Methods.js állományra a parancsállományban hivatkozunk:
<JOB>
  <script language="JScript" src="Methods.js"/>
A műveletben az XML-állományt a következőképpen hoztuk létre:
    <SCRIPT>
      ...
      xmlFile = fso.CreateTextFile("drives_info.xml", -1);
A parancssori argumentumokat beolvassuk egy karakterlánc objektumba:
      var args = WScript.Arguments;  
      var dr = new String(args(0));
A tömböt feldolgozzuk, az elemeket megvizsgáljuk, hogy milyen merevlemez-típust takarnak:
     for(c=0;c<dr.length;c++)      
     {
       var fulldr = new String(dr.substr(c,1) + ":\\");
       var s = new Number(IsFixedDrive(fulldr));
       if (s == 2)
       {
         drives[c] = fulldr;  
       } 
     }
Majd az xmlFile objektum WriteLine metódusával soronként létrehozzuk az XML-t. Látható, hogy a Wsh03.wsf parancsállomány egy <job></job> elempárt tartalmaz.
      xmlFile.WriteLine("<?xml version=\"1.0\" ?>");
      ...
    </SCRIPT>
  </JOB>

Windows Script Host lehetőségei cikksorozat