[icoSystem.png]Sitemap
[icoDocs.png]Documents
[icoFolderApps.png]Program files
[icoFolderWin.png]Windows
[icoFolderWin.png] Windows[icoScript.png] Windows Script Host scripts
[icoScript.png]
 Windows Script Host scripts (9oct2010)
In Windows there are some script interpreters natively available, much more powerful than the usual dos shell cmd. Generally my advice is to use cross platform third party interpreters like PHP, Pyton, Perl, ... Bit if you need to do some operations on foreign PCs without installing anything you can take advantage of WSH. Here are some examples of what you can do, mostly written in javascript simply because is much more better than VBScript. How to use: ensure WSH is enabled in your windows environment, create a text file with the indicated name, copy the content in it and then run.
  • Shutdown the PC:
     Shutdows.js
    (new ActiveXObject("Shell.Application")).ShutdownWindows();
  • Prompt for user input:
     input.wsf
    <job id="ComputeInput"> <script language="VBScript"> Function WSHInputBox(Message, Title, Value) WSHInputBox = InputBox(Message, Title, Value) End Function </script> <script language="JScript"> var sNum = WSHInputBox("Enter a number",WScript.ScriptFullName,"1"); var fNum = parseFloat(sNum); WScript.Echo(fNum + " x " + fNum + " = " + (fNum*fNum)); </script> </job>
  • Retrieve some system informations:
     sysinfo.wsf
    <job id="SysInfo"> <script language="VBScript"> Function WSHInputBox(Message, Title, Value) WSHInputBox = InputBox(Message, Title, Value) End Function </script> <script language="JScript"> // Common used objects var oWsh = new ActiveXObject("WScript.Shell"); var oWshSysEnv = oWsh.Environment("SYSTEM"); var oWshPrcEnv = oWsh.Environment("PROCESS"); var oWfs = new ActiveXObject("Scripting.FileSystemObject"); var oWnet = WScript.CreateObject("WScript.Network"); // Date var sMsg = "Data retrived on "; sMsg += new Date(); // Computer sMsg += "\nProcessors: " + oWshSysEnv("NUMBER_OF_PROCESSORS"); sMsg += "\nArchitecture: " + oWshSysEnv("PROCESSOR_ARCHITECTURE"); sMsg += "\nOS: " + oWshSysEnv("OS"); sMsg += "\nDomain = " + oWnet.UserDomain; sMsg += "\nComputer Name = " + oWnet.ComputerName; sMsg += "\nUser Name = " + oWnet.UserName; // Some folders sMsg += "\n\nWindows folder: " + oWshPrcEnv("SYSTEMROOT"); sMsg += "\nPrograms folder: " + oWshPrcEnv("ProgramFiles"); sMsg += "\nTemp folder: " + oWshPrcEnv("TEMP"); sMsg += "\nDesktop folder: " + oWsh.SpecialFolders("Desktop"); sMsg += "\nFavorites folder: " + oWsh.SpecialFolders("Favorites"); sMsg += "\nMyDocuments folder: " + oWsh.SpecialFolders("MyDocuments"); sMsg += "\nPrograms menu folder: " + oWsh.SpecialFolders("Programs"); sMsg += "\nRecent folder: " + oWsh.SpecialFolders("Recent"); sMsg += "\nSendTo folder: " + oWsh.SpecialFolders("SendTo"); sMsg += "\nStartup folder: " + oWsh.SpecialFolders("Startup"); sMsg += "\nNetHood folder: " + oWsh.SpecialFolders("NetHood"); sMsg += "\nPrintHood folder: " + oWsh.SpecialFolders("PrintHood"); // Drives sMsg += "\n\nDrives:"; var oDrives = new Enumerator(oWfs.Drives); for( oDrives.moveFirst(); !oDrives.atEnd(); oDrives.moveNext() ) { if (oDrives.item().DriveType == 3) sMsg += "\n" + oDrives.item().ShareName; else if (oDrives.item().IsReady) sMsg += "\n" + oDrives.item().VolumeName + " (" + oDrives.item().FreeSpace/1048576 + " MB free)"; } var oNetDrives = oWnet.EnumNetworkDrives(); for(var i=0; i<oNetDrives.Count(); i+=2) { sMsg += "\nNet drive " + oNetDrives.Item(i) + " = " + oNetDrives.Item(i+1); } // Printers sMsg += "\n\nPrinter mappings:"; var oPrinters = oWnet.EnumPrinterConnections(); for(var i=0; i<oPrinters.Count(); i+=2) { sMsg += "\n" + "Port \'" + oPrinters.Item(i) + "\': " + oPrinters.Item(i+1); } // Finally WScript.Echo(sMsg); </script> </job>
  • Iterate through files:
     loopfiles.wsf
    <job id="LoopFiles"> <script language="JScript"> // Common used objects var oWsh = new ActiveXObject("WScript.Shell"); var oWfs = new ActiveXObject("Scripting.FileSystemObject"); // Retrieve a target folder var sFld = oWsh.SpecialFolders("Desktop"); if ( !oWfs.FolderExists(sFld) ) throw new Error("No folder?!"); // List all files there var eFiles = new Enumerator(oWfs.GetFolder(sFld).Files); var sMsg = "Files contained in \'" + sFld + "\':\n"; for( eFiles.moveFirst(); !eFiles.atEnd(); eFiles.moveNext() ) { sMsg += eFiles.item().Name + ", "; } WScript.Echo(sMsg); </script> </job>
  • Create and write a text file:
     writetxtfile.wsf
    <job id="CreateTextFile"> <script language="JScript"> // Common objects var oFs = new ActiveXObject("Scripting.FileSystemObject"); // Main task var f = oFs.CreateTextFile("c:\\testfile.txt", true); f.WriteLine("ciao"); f.Close(); </script> </job>
  • A full example:
     Release.wsf
    <!-- Release current revision 2010-10-06 - Matteo Gattanini --> <job id="Release"> <script language="VBScript"> Function WSHInputBox(Message, Title, Value) WSHInputBox = InputBox(Message, Title, Value) End Function </script> <script language="JScript"> /////////////////////////////// Settings //////////////////////////////// var prjname = "MasterFR"; // Must be also the folder name!! var svnrep = "file://Secondary/uff-ass/SW/Repositories/svn_MasterFR"; var dstroot= "\\\\Secondary\\UFF-ASS\\SW\\SAGOMATO\\MasterFR"; var relfile = "Releases.txt"; var cnmainfile = "Prg\\StartUpMacchina.src"; var plcmainfile = "plc\\mastmola\\main.plc"; var csx = "\\SiaxEd\\Bin\\Csx501.exe -g -ha -nologo"; var plc = "\\WPlc\\CmpPlc.exe"; var bSvn = true; // Use subversion /////////////////////////////// Main task /////////////////////////////// // Common used objects var oWsh = new ActiveXObject("WScript.Shell"); var oWfs = new ActiveXObject("Scripting.FileSystemObject"); var oWnet = WScript.CreateObject("WScript.Network"); // Retrieve environment variables var dToday = new Date(); var oPrcEnv = oWsh.Environment("PROCESS"); var sPrgFld = oPrcEnv("ProgramFiles"); //var sDeskFld = oWsh.SpecialFolders("Desktop"); // Elaborate settings csx= oWfs.BuildPath(sPrgFld,csx); cnmainfile = oWfs.GetAbsolutePathName(cnmainfile); var cnprgfld = oWfs.GetParentFolderName(cnmainfile); plcmainfile = oWfs.GetAbsolutePathName(plcmainfile); // Check source if ( !oWfs.FileExists(cnmainfile) ) throw new Error("Non riesco a vedere \'" + cnmainfile + "\' !!"); if(CompileSiax(oWfs,cnprgfld)) throw new Error("I files CN non si compilano correttamente, controlla!"); // Check destination var oDestFld; try {oDestFld = oWfs.GetFolder(dstroot); } catch(e) { throw("Errore: " + e.message + "\nDevi essere collegato al server per accedere a:\n"+dstroot); } // Get release numbers… var sReleases = "The number you put in PLC and CN of: "+prjname; // …from subversion… if (bSvn) sReleases += "\n\n Subversion revision is: " + GetSvnReleaseNum(oWsh); // …from directory… var oDirRel = GetDirReleaseNum(ListSubfolders(oDestFld,dstroot)); sReleases += "\n\n Last released (in server) is: " + oDirRel.suffix; // …from CN source file… var nPrgRel = GetSrcReleaseNum(oWfs,cnmainfile,/\bnCN_SW_Ver\b/); sReleases += "\n\n In CN \'"+oWfs.GetBaseName(cnmainfile)+"\' is: " + nPrgRel; // …from PLC source file… var nPlcRel = GetSrcReleaseNum(oWfs,plcmainfile,/vn4095\b/i); // new RegExp("vn4095\\b","i") sReleases += "\n\n In PLC \'"+oWfs.GetBaseName(plcmainfile)+"\' is: " + nPlcRel; // Choose the release number manually var sDefRel = nPrgRel.toString(); for(var i=sDefRel.length; i<3; ++i) sDefRel = "0" + sDefRel; var sRel = WSHInputBox(sReleases,"Enter release number",sDefRel); if(sRel) { // Destination directory var sDestFldName = prjname + "_" + sRel; var sDestFld = oWfs.BuildPath(dstroot,sDestFldName); if ( oWfs.FolderExists(sDestFld) ) { oWsh.Run(dstroot,1,false); throw new Error("Una release " + sRel + " esiste già, controlla!!"); } // Enter a release note var sRelNotes = WSHInputBox("Why are you releasing this?","Enter a release note","Rilasciato per cliente, fix baco ..."); if(sRelNotes) { // Export files if(bSvn) SvnExport(oWsh, oWsh.CurrentDirectory, sDestFld); else CopyFolder(oWfs,oWsh.CurrentDirectory,sDestFld,/\.svn/); // Update release files AppendRelease(oWfs,oWnet,oWfs.BuildPath(dstroot,relfile),sRelNotes); AppendRelease(oWfs,oWnet,oWfs.BuildPath(sDestFld,relfile),sRelNotes); // Finally oWsh.Run(dstroot,1,false); // Open destination folder } } //////////////////////////////// Functions ////////////////////////////// //----------------------------------------------------------------------- // Returns an array containing the subfolders given a folder object function ListSubfolders(fld,pth) { var eFlds = new Enumerator(fld.SubFolders); // Files var lst = new Array(); for( eFlds.moveFirst(); !eFlds.atEnd(); eFlds.moveNext() ) lst.push(eFlds.item().Name); return lst; } // end 'ListSubfolders' //----------------------------------------------------------------------- // Returns the release number from Siax CN source function GetSvnReleaseNum(sh) { var oSvnVer = sh.Exec("svnversion . " + svnrep); while (oSvnVer.Status == 0) WScript.Sleep(100); return oSvnVer.StdOut.ReadAll().replace(/^\s\s*/,'').replace(/\s\s*$/,''); } // end 'GetSvnReleaseNum' //----------------------------------------------------------------------- // Returns the release number from Siax CN source function GetSrcReleaseNum(fs,pth,reg) { var f = fs.GetFile(pth).OpenAsTextStream(1); // 1:read 2:write 8:append var sLine,srel=""; while (!f.AtEndOfStream) { sLine = f.ReadLine(); if (reg.exec(sLine)) { srel = RegExp.rightContext.match(/\d+/); break; } } f.Close(); return parseFloat(srel); } // end 'GetSrcReleaseNum' //----------------------------------------------------------------------- // Returns the last release number from a list of names function GetDirReleaseNum(lst) { var rSfx= new RegExp("\\d+.*$"); var sTmpSfx="",sRelSfx=""; var nTmp=0, nRel=0; for(var k in lst) { sTmpSfx = lst[k].match(rSfx); nTmp = parseFloat(sTmpSfx); if(nRel<nTmp) {nRel=nTmp; sRelSfx=sTmpSfx;} } return {suffix: sRelSfx, index: nRel}; } // end 'GetDirReleaseNum' //----------------------------------------------------------------------- // Returns the last release number from a list of names function AppendRelease(fs,onet,pth,cnt) { //var f = oWfs.FileExists(pth) ? fs.OpenTextFile(pth, 8, true, 0) : fs.CreateTextFile(pth, true, 0); var f = fs.OpenTextFile(pth, 8, true, 0); f.WriteBlankLines(2); f.WriteLine(sDestFldName + " ("+dToday.toLocaleDateString()+" "+dToday.toLocaleTimeString()+") ("+onet.UserName+"@"+onet.ComputerName+"@"+onet.UserDomain+")"); f.WriteLine("\t"+cnt); f.Close(); } // end 'AppendRelease' //----------------------------------------------------------------------- // Export with svn function SvnExport(sh, srcpth, dstpth) { var oSvnVer = sh.Exec("svn export \"" + srcpth + "\" \"" + dstpth + "\""); while (oSvnVer.Status==0) WScript.Sleep(100); if (oSvnVer.ExitCode!=0) throw new Error("Export fallito da \'" + srcpth + "\' a \'" + dstpth + "\'"); } // end function 'SvnExport' //----------------------------------------------------------------------- // TODO: Recursively copy except some files function CopyFolder(fs, srcpth, dstpth, exc) { fs.CopyFolder(srcpth,dstpth,true); /* //fs.CreateFolder(fs.BuildPath(dstpth,fs.GetBaseName(srcpth))); WScript.Echo(srcpth); var fld = fs.GetFolder(srcpth); var eFolders = new Enumerator(fld.SubFolders); var eFiles = new Enumerator(fld.Files); for( eFiles.moveFirst(); !eFiles.atEnd(); eFiles.moveNext() ) if(!eFiles.item().match(exc)) eFiles.item().Copy(dstpth,true); for( eFolders.moveFirst(); !eFolders.atEnd(); eFolders.moveNext() ) if(!eFolders.item().match(exc)) CopyFolder(fs, eFolders.item().Name, dstpth, exc); */ } // end function 'CopyFolder' //----------------------------------------------------------------------- // Compile Siax CN source files, returns the number of errors function CompileSiax(fs,prgfld) { // Prepare shell var wsh = new ActiveXObject("WScript.Shell"); wsh.CurrentDirectory = prgfld; // All source files var eFiles = new Enumerator(fs.GetFolder(prgfld).Files); var errs = 0; for( eFiles.moveFirst(); !eFiles.atEnd(); eFiles.moveNext() ) { if(eFiles.item().Name.match(/\.src?$/i)) { if(wsh.Run(csx+" "+eFiles.item().Name,0,true)!=0) ++errs; } } return errs; } // end 'CompileSiax' </script> </job>