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">
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");
var sMsg = "Data retrived on ";
sMsg += new Date();
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;
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");
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);
}
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);
}
WScript.Echo(sMsg);
</script>
</job>
- Iterate through files:
loopfiles.wsf<job id="LoopFiles">
<script language="JScript">
var oWsh = new ActiveXObject("WScript.Shell");
var oWfs = new ActiveXObject("Scripting.FileSystemObject");
var sFld = oWsh.SpecialFolders("Desktop");
if ( !oWfs.FolderExists(sFld) ) throw new Error("No folder?!");
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">
var oFs = new ActiveXObject("Scripting.FileSystemObject");
var f = oFs.CreateTextFile("c:\\testfile.txt", true);
f.WriteLine("ciao");
f.Close();
</script>
</job>
- A full example:
Release.wsf
<job id="Release">
<script language="VBScript">
Function WSHInputBox(Message, Title, Value)
WSHInputBox = InputBox(Message, Title, Value)
End Function
</script>
<script language="JScript">
var prjname = "MasterFR";
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;
var oWsh = new ActiveXObject("WScript.Shell");
var oWfs = new ActiveXObject("Scripting.FileSystemObject");
var oWnet = WScript.CreateObject("WScript.Network");
var dToday = new Date();
var oPrcEnv = oWsh.Environment("PROCESS");
var sPrgFld = oPrcEnv("ProgramFiles");
csx= oWfs.BuildPath(sPrgFld,csx);
cnmainfile = oWfs.GetAbsolutePathName(cnmainfile);
var cnprgfld = oWfs.GetParentFolderName(cnmainfile);
plcmainfile = oWfs.GetAbsolutePathName(plcmainfile);
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!");
var oDestFld;
try {oDestFld = oWfs.GetFolder(dstroot); }
catch(e) { throw("Errore: " + e.message + "\nDevi essere collegato al server per accedere a:\n"+dstroot); }
var sReleases = "The number you put in PLC and CN of: "+prjname;
if (bSvn) sReleases += "\n\n Subversion revision is: " + GetSvnReleaseNum(oWsh);
var oDirRel = GetDirReleaseNum(ListSubfolders(oDestFld,dstroot));
sReleases += "\n\n Last released (in server) is: " + oDirRel.suffix;
var nPrgRel = GetSrcReleaseNum(oWfs,cnmainfile,/\bnCN_SW_Ver\b/);
sReleases += "\n\n In CN \'"+oWfs.GetBaseName(cnmainfile)+"\' is: " + nPrgRel;
var nPlcRel = GetSrcReleaseNum(oWfs,plcmainfile,/vn4095\b/i);
sReleases += "\n\n In PLC \'"+oWfs.GetBaseName(plcmainfile)+"\' is: " + nPlcRel;
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)
{
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!!");
}
var sRelNotes = WSHInputBox("Why are you releasing this?","Enter a release note","Rilasciato per cliente, fix baco ...");
if(sRelNotes)
{
if(bSvn) SvnExport(oWsh, oWsh.CurrentDirectory, sDestFld);
else CopyFolder(oWfs,oWsh.CurrentDirectory,sDestFld,/\.svn/);
AppendRelease(oWfs,oWnet,oWfs.BuildPath(dstroot,relfile),sRelNotes);
AppendRelease(oWfs,oWnet,oWfs.BuildPath(sDestFld,relfile),sRelNotes);
oWsh.Run(dstroot,1,false);
}
}
function ListSubfolders(fld,pth)
{
var eFlds = new Enumerator(fld.SubFolders);
var lst = new Array();
for( eFlds.moveFirst(); !eFlds.atEnd(); eFlds.moveNext() ) lst.push(eFlds.item().Name);
return lst;
}
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*$/,'');
}
function GetSrcReleaseNum(fs,pth,reg)
{
var f = fs.GetFile(pth).OpenAsTextStream(1);
var sLine,srel="";
while (!f.AtEndOfStream)
{
sLine = f.ReadLine();
if (reg.exec(sLine))
{
srel = RegExp.rightContext.match(/\d+/);
break;
}
}
f.Close();
return parseFloat(srel);
}
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};
}
function AppendRelease(fs,onet,pth,cnt)
{
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();
}
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 + "\'");
}
function CopyFolder(fs, srcpth, dstpth, exc)
{
fs.CopyFolder(srcpth,dstpth,true);
}
function CompileSiax(fs,prgfld)
{
var wsh = new ActiveXObject("WScript.Shell");
wsh.CurrentDirectory = prgfld;
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;
}
</script>
</job>