MSFN Forum: [Feature] {OS=...} filter for commands and {X86}/{X64} improvement v1. - MSFN Forum

Jump to content


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

[Feature] {OS=...} filter for commands and {X86}/{X64} improvement v1. Adds a filter to run commands only on certain OS versions Rate Topic: -----

#1 User is offline   Francesco 

  • Advanced Member
  • PipPipPip
  • Group: Members
  • Posts: 394
  • Joined: 20-March 04

Posted 18 May 2012 - 09:33 AM

Description
Adds an {OS=...} filter to allow commands being executed only on certain OS versions. Useful to install missing libraries or runtimes on older OSes. You can put any other command type statement ({FILECOPY},{RENAME},{DIRCOPY}...) after the filter statement and the same feature was added to the {X86} and {X64} statements. You can even combine {X86} and {X64} statements with the {OS=...} filter.

Example
{OS=Win7,Vista} "%WpiPath%\Install\MyApplication\MyApplicationSetup.exe" will execute the command only on Windows 7 and Vista (no XP, 2000 and previous).

Current issues
- I changed almost all the code in the function to improve the statement parsing so this change still needs proper testing

Fix
In installer.js replace the handleCommand function with this new one

function handleCommand(cmd,item,cmdNum)
{
	position="installer.js";
	whatfunc="handleCommand()";

	var braceEndPosition = cmd.indexOf("}");
	if (cmd.substr(0,1)=="{" && braceEndPosition > 0)
	{
		var statementToken = cmd.substr(1,braceEndPosition-1);
		var splittedStatementToken = statementToken.split("=");
		var statement = splittedStatementToken[0].toUpperCase();
		var statementArguments = splittedStatementToken.length > 1 ? splittedStatementToken[1] : "";
		
		if (statement == "JSCRIPT")
			return cmd;
		
		cmd = cmd.substr(braceEndPosition+1, cmd.length).replace(/^\s+/,"");

		switch(statement)
		{
			case 'OS':
				var supportedOSes = statementArguments.split(',');
				var uppercaseCurrentOS = getOSver().toUpperCase();
				for (var supportedOSNum = 0; supportedOSNum < supportedOSes.length; supportedOSNum++)
					if (uppercaseCurrentOS == supportedOSes[supportedOSNum].replace(/^\s+|\s+$/g,"").toUpperCase())
						return handleCommand(cmd,item,cmdNum);
				cmd="SKIP0";
				fsoCmd=false;
				break;

			case 'X86':
				if (getBits()==32)
					return handleCommand(cmd,item,cmdNum);
				cmd="SKIP0";
				fsoCmd=false;
				break;

			case 'X64':
				if (getBits()==64)
					return handleCommand(cmd,item,cmdNum);
				cmd="SKIP0";
				fsoCmd=false;
				break;

			case 'WEB':
				document.getElementById("InstallItem").innerHTML=getText(lblViewing)+" "+cmd;
				cmd='"'+ReplacePath("%programfiles%\\Internet Explorer\\iexplore.exe")+'" '+cmd;
				UpdateInstallList(("div"+item+"_"+cmdNum+"_"+FailNum),getText(txtInstallViewing));
				isIE=true;
				fsoCmd=false;
				break;

			case 'DOWNLOAD':
				cmd=DownloadFile(cmd,item,cmdNum);
				fsoCmd=false;
				break;

			case 'NETSH':
				cmd="CMD /C NETSH " + cmd;
				cmd=ReplacePath(cmd);
				fsoCmd=true;
				break;

			case 'REGDLL':
				cmd="CMD /C REGSVR32 /S " + cmd;
				fsoCmd=true;
				break;

			case 'UNREGDLL':
				cmd="CMD /C REGSVR32 /U /S " + cmd;
				fsoCmd=true;
				break;

			case 'INSTINF':
				cmd="CMD /C RUNDLL32 setupapi.dll,InstallHinfSection DefaultInstall 132 " + cmd;
				fsoCmd=true;
				break;

			case 'LAUNCHINF':
				cmd="CMD /C RUNDLL32 advpack.dll,LaunchINFSection " + cmd;
				fsoCmd=true;
				break;

			case 'REGEDIT':
				if (FileExists(cmd))
				{
					if (cmd.indexOf(" ") != -1 && cmd.substr(0,1) != '"')
						cmd='"'+cmd+'"';
					if (programs[item].bit64=="yes" && OSBits==64)
						cmd='"'+sysPath64+'RegEdt32" /S ' + cmd;
					else
						cmd='"'+sysPath32+'RegEdit" /S ' + cmd;
					fsoCmd=true;
				}
				else
					cmd=getText(txtErrorRegEditFileExists);
				break;

			case 'EXTRACT':
				var src, dst, splits;

				src=dst=cmd;
				if (cmd.indexOf('" "') != -1)
				{
					splits=cmd.split('" "');
					src=splits[0];
					dst=splits[1];
				}
				else
				{
					if (src.substr(0,1)=='"')
					{
						splits=cmd.split('" ');
						src=splits[0];
						dst=splits[1];
					}
					else
					{
						splits=cmd.split(' ');
						src=splits[0];
						dst=splits[1];
					}
				}
				src=src.replace(/\"/g,"");
				dst=dst.replace(/\"/g,"");
				cmd='"'+wpipath+'\\Tools\\7z\\7z.exe" x "'+src+'" -aoa -o"'+dst+'"';
				fsoCmd=true;
				if (src.indexOf("*")==-1)
				{
					if (!FileExists(src))
						cmd=getText(txtErrorExtractFileExists);
				}
				break;

			case 'FILECOPY':
				cmd="CMD /C COPY /Y " + cmd;
				fsoCmd=true;
				break;

			case 'FILEMOVE':
				cmd="CMD /C MOVE /Y " + cmd;
				fsoCmd=true;
				break;

			case 'RENAME':
				cmd="CMD /C REN " + cmd;
				fsoCmd=true;
				break;

			case 'DELETE':
				cmd="CMD /C DEL /F /Q " + cmd;
				fsoCmd=true;
				break;

			case 'MAKEDIR':
				cmd="CMD /C MD " + cmd;
				fsoCmd=true;
				break;

			case 'DIRCOPY':
				cmd="CMD /C XCOPY " + cmd + " /C /I /E /Y /H /R";
				fsoCmd=true;
				break;

			case 'DIRMOVE':
				cmd="{JSCRIPT}=MoveDirectory(\'" + cmd + "\')";
				break;

			case 'DELDIR':
				cmd="CMD /C RD /S /Q " + cmd;
				fsoCmd=true;
				break;

			case 'RUNBG':
				waitForIt=false;
				break;

			case 'TASKKILL':
				cmd="{JSCRIPT}=TerminateProcess(\"" + cmd + "\")";
				break;

			case 'SLEEP':
				cmd="\"" + wpipath + "\\Tools\\Sleep.exe\"" + cmd;
				fsoCmd=true;
				break;

			case 'REBOOT':
				cmd="\"" + sysdir + "\\shutdown.exe\" /r /f /t " + (cmd.length > 0 ? cmd : "0");
				fsoCmd=true;
				break;

			case 'START':
				cmd="CMD /C START " + cmd;
				fsoCmd=true;
				break;
		}
		return cmd;
	}

	if (cmd.indexOf(".cmd") != -1 || cmd.indexOf(".bat") != -1)
	{
		if (cmd.indexOf(" ") != -1 && cmd.substr(0,1) != '"')
			cmd='"'+cmd+'"';
		if (programs[item].bit64=="yes" && OSBits==64)
			cmd='"'+sysPath64+'cmd.exe" /C '+cmd;
		else
			cmd='"'+sysPath32+'cmd.exe" /C '+cmd;

		return cmd;
	}

//	if (cmd.indexOf(" ")==-1 && cmd.substr(0,1) != '"')
	if (cmd.indexOf(" ")==-1 && cmd.substr(0,1) != '"' && cmd.indexOf(">")==-1)	// > needed for stdout.  "d:\program.exe" "param1" >c:\app.txt
		cmd='"'+cmd+'"';

	return cmd;
}


In configwizard.js replace

	CommandsMenuBar.addNewSibling("internet", "cmd_other", getText(lblOther), false);
		CommandsMenuBar.addNewChild("cmd_other", 0, "other_architecture", getText(lblArchitecture), false, "", "");
			CommandsMenuBar.addNewChild("other_architecture", 0, "architecture_x86", "x86", false, "", "");
			CommandsMenuBar.addNewChild("other_architecture", 1, "architecture_x64", "x64", false, "", "");
		CommandsMenuBar.addNewChild("cmd_other", 1, "other_runbg", "Run In Bg", false, "", "");
		CommandsMenuBar.addNewChild("cmd_other", 2, "other_taskkill", "TaskKill", false, "", "");
		CommandsMenuBar.addNewChild("cmd_other", 3, "other_sleep", "Sleep", false, "", "");
		CommandsMenuBar.addNewChild("cmd_other", 4, "other_reboot", "Reboot", false, "", "");



with

	CommandsMenuBar.addNewSibling("internet", "cmd_cond", getText(lblCondition), false);
		CommandsMenuBar.addNewChild("cmd_cond", 0, "cmd_cond_operatingsystem", getText(lblOperatingSystem), false, "", "");
		CommandsMenuBar.addNewChild("cmd_cond", 1, "cmd_cond_architecture", getText(lblArchitecture), false, "", "");
			CommandsMenuBar.addNewChild("cmd_cond_architecture", 0, "cmd_cond_architecture_x86", "x86", false, "", "");
			CommandsMenuBar.addNewChild("cmd_cond_architecture", 1, "cmd_cond_architecture_x64", "x64", false, "", "");
	CommandsMenuBar.addNewSibling("cmd_cond", "cmd_other", getText(lblOther), false);
		CommandsMenuBar.addNewChild("cmd_other", 1, "other_runbg", "Run In Bg", false, "", "");
		CommandsMenuBar.addNewChild("cmd_other", 2, "other_taskkill", "TaskKill", false, "", "");
		CommandsMenuBar.addNewChild("cmd_other", 3, "other_sleep", "Sleep", false, "", "");
		CommandsMenuBar.addNewChild("cmd_other", 4, "other_reboot", "Reboot", false, "", "");



and replace

		case 'architecture_x86':
			HandleCommandsSelectionMenu("{x86} ");
			break;

		case 'architecture_x64':
			HandleCommandsSelectionMenu("{x64} ");
			break;



with

		case 'cmd_cond_operatingsystem':
			HandleCommandsSelectionMenu("{OS=Win7,Vista,XP} ");
			break;

		case 'cmd_cond_architecture_x86':
			HandleCommandsSelectionMenu("{x86} ");
			break;

		case 'cmd_cond_architecture_x64':
			HandleCommandsSelectionMenu("{x64} ");
			break;


This post has been edited by Francesco: 18 May 2012 - 09:28 PM



#2 User is offline   Kelsenellenelvian 

  • WPI Guru
  • Group: Developers
  • Posts: 8,326
  • Joined: 18-September 03
  • OS:Windows 7 x64
  • Country: Country Flag

Posted 19 May 2012 - 01:47 PM

Added in 8.5

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

2 User(s) are reading this topic
0 members, 2 guests, 0 anonymous users



All trademarks mentioned on this page are the property of their respective owners
Copyright © 2001 - 2013 msfn.org
Privacy Policy