Update 2016-06-08: WordPress keeps butchering the code so I’m removing the pretty formatting for now.
I’m only mentioning this because of something that came up recently and I thought it was kind of neat.
To keep things simple, I’m going to break this up into a few posts:
About 4 if not almost 5 years ago, before I learned the ways of PowerShell, I moved up from Batch to VBScript mostly when things got complicated. I was still getting used to PowerShell, practicing on doing simple things like managing AD objects and doing things in Exchange (mail exports, delegation, tracking down messages etc.) so I relied heavily on Batch and VBScript to get things done because they were languages I was quite comfortable with.
SCCM 2012 (no R2) is my first foray into the System Center ecosystem and I was excuted as it was supposed to solve many of the problems we faced with the imaging process we had then, and address nearly all of our concerns with some of changes we would be making in a year’s time or so. Like most organizations we have a hefty list of applications on all of our workstations that usually fall into one of the following categories:
- Core Apps – These are applications required by just about everyone in the organization like Microsoft Office, FileSite, EMM etc.
- Practice Apps – These are applications required by those in a particular practice group (IP, Litigation, Trust & Estates etc.) or a functional group (Development, Admin/HR, Accounting etc.)
- Extra Apps – These are usually applications that aren’t necessarily required but are often needed.
When creating the Task Sequence, we had two options for installing applications:
- Add the applications to the installation list, or
- Install applications according to a dynamic variable list.
The former is great because it allows a friendly interface for selecting, adding and organizing the applications for installation. The biggest drawback here is that each task can only support 9 application installations, which means more install application tasks and a lot of clicking.
The latter is also great because one can define Collection Variables that correspond to applications and install them on the fly. Its biggest drawback was that it required maintaining a list of Collection Variables in potentially multiple collections and I didn’t want to spend my time renumbering because I removed or added an application since there couldn’t be any gaps in the numbers. Augh.
Please don’t misconstrue: Both methods work and I’m not trying to knock either method!
Note: It’s possible things have changed since then and maybe there was in fact a solution addressing this exact problem. I wasn’t an expert then – nor am I an expert now – so I improvised.
I thought to myself “Wouldn’t it neat if I could generate sequentially numbered variables on the fly at runtime?” Then it dawned on me: my old batch script! I decided to write a small vbscript that I could use to populate those variables in the TS.
I ended up with something very similar to what’s below. It was a ‘proof-of-concept’ script running in my, then, lab environment and it worked wonderfully straight through to production.
option explicit ' Lets define our array housing the core applications. ' Easy to add, delete & reorganize. ' ' NOTE: The application names here corespond to the application ' names within SCCM 2012 dim arrCoreApps : arrCoreApps=Array("Microsoft Office Professional Plus 2099",_ "FileSite",_ "DeskSite",_ "Nuance PDF Converter Enterprise",_ "Workshare Professional",_ "PayneGroup Metadata Assistant",_ "PayneGroup Numbering Assistant",_ "Adobe Acrobat Pro",_ "Some Fake App",_ "Some Real App"_ ) ' With the array populated, lets build sequentially numbered variables with a static prefix ' The prefix here is CoreApps ' This is variable that should be used in the Application Install Task Sequence step. BuildApplicationVariables arrCoreApps,"CoreApps" ' Lets make sure the Task Sequence Variables have successfully been defined RetrieveApplicationVariables arrCoreApps,"CoreApps" wscript.echo ' Another example dim arrExtraApps : arrExtraApps=Array("Java",_ "Google Chrome",_ "Mozilla Firefox"_ ) BuildApplicationVariables arrExtraApps,"ExtraApps" RetrieveApplicationVariables arrExtraApps,"ExtraApps" Sub BuildApplicationVariables(Required_Application_Array,Required_Prefix) dim arrApplications : arrApplications = Required_Application_Array dim sPrefix : sPrefix = Required_Prefix dim i For i=0 to UBound(arrApplications) if (i+1 < 10) Then Execute "wscript.echo ""Creating Variable ["" & sPrefix & 0 & i+1 & ""] Containing ["" & arrApplications(i) & ""]""" ExecuteGlobal sPrefix & "0" & i+1 & "=" & """" & arrApplications(i) & """" else Execute "wscript.echo ""Creating Variable [" & sPrefix & i+1 & "] Containing [" & arrApplications(i) & "]""" ExecuteGlobal sPrefix & i+1 & "=" & """" & arrApplications(i) & """" end if Next End Sub Sub RetrieveApplicationVariables(Required_Application_Array,Required_Prefix) dim arrApplications : arrApplications = Required_Application_Array dim sPrefix : sPrefix = Required_Prefix dim i For i=0 to UBound(arrApplications) if (i+1 < 10) Then Execute "wscript.echo vbtab & ""[" & sPrefix & "0" & i+1 & "] = ["" & " & sPrefix & "0" & i+1 & " & ""]""" else Execute "wscript.echo vbtab & ""[" & sPrefix & i+1 & "] = ["" & " & sPrefix & i+1 & " & ""]""" end if Next end Sub
Anyway this worked well for us in setting up those dynamic variables on the fly and it’s a piece of code I’ll keep in my back pocket just in case.