PDA

View Full Version : Using VBScript arrays


gdanko
05-27-2003, 01:41 PM
I want to use VBT to automate software deployments at the office. There are roughly 10 servers I deploy to and they’re split up into two batches. I’ve created arrays to access each server by name and I’d like to access the array variable in VBT. My project in its simple form looks like this:



Foundry (Group)
Initialize Batch1 Variables (VBScript)
Run Loop (Group
Do Stuff Here
Do More Stuff Here
Increment Counter

So the Foundry group initializes some variables and defines an array. The initialize script looks like this.

Dim Batch1(5)
Batch1(0) = "order1"
Batch1(1) = "order2"
Batch1(2) = "product5"
Batch1(3) = "product6"
Batch1(4) = "orderadmin9"

Application.Macros(vbldTemporary).Add "SERVER_NUMBER", "0"
'Application.Macros(vbldTemporary).Add "SERVER_ARRAY", Batch1
Application.Macros(vbldTemporary).Add "TOTAL_BATCH1", UBound(Batch1)

SERVER_NUMBER is a counter that simply defines how many iterations to run. I define it as 0 here because the first element in the array is always 0.
SERVER_ARRAY, which is commented out is where I’d like to pass the array from the VBScript to VisualBuildTool.
TOTAL_BATCH1 is just the number of the highest element in the array.

What I want to happen is in the loop, certain actions will be performed on %SERVER_ARRAY%(%SERVER_NUMBER%)

This should equate to Batch1(0)…(Batch1(4)

But I get errors when I try to move the array over into VBT.

Any help is appreciated.

pjaquiery
05-27-2003, 03:56 PM
I think you need to turn the problem inside out. Store the array as a VBP macro and use a bit of script to extract the elements one at a time, perhaps to another VBP macro.

In similar situations I use strings of comma delimited elements as an "array" and have a script function that pops the first element off the list.

gdanko
05-27-2003, 04:46 PM
Got any examples on how to store the array as a VBP array? Until hearing from you I will experiment. :)

kinook
05-27-2003, 04:54 PM
Script variables do not persist outside of a Run Script step. One way to accomplish this would be to put your generic steps into a subroutine (on the Subroutine Steps or Global Subroutine Steps tab) and add one Subroutine Call step for each server in the Project Steps, passing the dynamic values for the subroutine on the Parameters tab. See the Advanced.bld or VisBuildPro.bld samples.

If you wanted to read the list of servers more dynamically (for instance, from a file), the Misc.bld sample ('Repeat for file contents' group) demonstrates how you can load a list of values into a temporary macro, and then loop over the macro, extracting each filename (using the vbld_AddDelimValue/vbld_NextDelimValue system script functions) and processing each one.

gdanko
05-27-2003, 04:55 PM
Every other variable comes through except the one where I try to pass the array. It errors out because I am trying to pass an array. If I assign any value, it works. I can send you a copy of the project if that helps.

gdanko
05-27-2003, 05:05 PM
I don't want to be able to access the VBS array Batch1() directly.

In this example I was able to assign the results of the VBS expression UBound(Batch1) to the VBP TOTAL_BATCH1. This works.

Application.Macros(vbldTemporary).Add "TOTAL_BATCH1", UBound(Batch1)

In VBS I can do something like this:

dim Array1(3)
Array1(0) = "Blah"
Array1(1) = "Foo"
Array1(2) = "Fubar"

ABC123 = Array1

MsgBox ABC123(2)

This code will give me a msgbox with "Fubar" in it. I am saying, this array in VBS is equal to this array in VBS.

I was able to pass an VBS variable to a VBP variable. I want to be able to pass my VBS array to VBP so it can be used.

The PDF documentation isn't of much help here.

gdanko
05-28-2003, 03:24 PM
problem solved :)

pjaquiery
05-28-2003, 03:46 PM
Out of interest, and for the edification of others who may have a similar problem, how do you solve it?

gdanko
05-28-2003, 03:48 PM
The first step of my loop determines the server name this way.

Dim Batch1(3)
Batch1(0) = "WWW6"
Batch1(1) = "WWW7"
Batch1(2) = "WWW8"

Application.Macros(vbldTemporary).Add "SERVER", Batch1(%COUNTER%)

The counter is increased with each iteration, so the current server name is set approriately.

I am now configuring it to read an .ini file for the number of servers and server names. :)