Contents of Guy's Scripting Ezine No 14 - Do...Loop Until
Many VBScripts need an instruction that repeats the same sequence for multiple
objects. For example, creating hundreds of computer accounts. The
Do...Loop is my secret for telling the script to keep cycling through the same
lines, until it reaches the end of the list. Perhaps you have already used
'For...Next' loops in other programming languages? In which case you will
already have a good idea of what Do...Loop can achieve.
Calculating IP Address
ranges is a black art, which many network managers solve by creating custom
Excel spreadsheets. IPAT cracks this problem of allocating IP addresses
in networks in two ways:
For Mr Organized there is a nifty subnet
calculator, you enter the network address and the subnet mask, then IPAT
works out the usable addresses and their ranges.
For Mr Lazy IPAT
discovers and then displays the IP addresses of existing computers.
Download the Free IP Address Tracker
I would like to introduce you to the family of Do ...Loop commands
Do....Loop Until and its 'brother', Do....Until
Do....Loop While and its 'sister',
The job of this family is to cycle through repetitive tasks like adding users
from rows in spreadsheets or reading through hundreds of objects in Active Directory.
This Do...Loop family operates by going through line after line of commands,
then circling back to the beginning and repeating commands for the next item.
The secret of avoiding endless loops is having an effective command to stop. To
halt the loop, you have a choice of two prepositions: Until or While. Both
'Loop Until' and 'Loop While' achieve the same goal - breaking the cycle.
It is just that their attitude is different; 'Do...Loop Until', is
adventurous, it keeps on going until stopped. On the other hand,
'Do...Loop While' is cautious, it only goes through the loop if the condition is
Another trade secret. I do not have the perfect Do...Loop example for Windows
2003. Instead I have two VBScripts, the first is ridiculously easy, but
doesn't do anything useful. The second example is powerful and
interesting, but it is technically demanding.
Copy the VBScript below, then paste into notepad and save as a .vbs.
Double click your .vbs file and see a message with the answer to the question:
What is the sum of 1 to 7?
' VBscript Very simple Do... Loop Until
' Guy Thomas January 2004
DIM inti, intx
inti = 0
inti = inti + 1
intx = intx + inti
Loop Until inti = 7
WScript.Echo " Sum of 1 to " & inti & " = " & intx
Note 1: inti is the counter; while intx is keeping the score.
Note 2: With each loop, the script adds another number to the sequence
Note 3: Beware, as with all Loop scripts, they must have a break
statement. Loop until inti = 7 is our command to break the loop.
Note 4: In the WScript.Echo statement I have added the two variables
inti and intx. My reasoning is this, if you do change Line 13: Loop Until inti = 7 to Loop Until
inti = 10, then you still get a meaningful message.
- Warning this script will alter the users description.
- As usual, copy and paste into notepad and save as a .vbs. You will
need a domain to get this script to work.
- You must change line 21 for the VBScript to work in your domain.
Find then alter:
ou=Worcester, dc=cp,dc=com. I also suggest that you create an OU and test user as necessary.
- Go to Active Directory Users and Computers, User, Property, then you will
see what changes your script has made.
' Guy Thomas January 2004
' WARNING - I am not a great one for disclaimers, but
' watch out! This script WILL CHANGE your Users Properties
' Modifying the DESCRIPTION property of Multiple Users
' Note best to choose a test OU with a test user (To begin with)
' Check the User's Property Tab : Description
DIM objConnection, objCommand, objRecordSet, objUser
DIM strChange, strADsPath, strProperty
strProperty = "Description"
strChange ="Hot Shot Professional"
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnection
objCommand.CommandText = _
"<LDAP://ou=Worcester, dc=cp,dc=com>;" & _
"(&(objectCategory=person)(objectClass=user));" & _
Set objRecordSet = objCommand.Execute
strADsPath = objRecordset.Fields("ADsPath")
Set objUser = GetObject(strADsPath)
objUser.Put strProperty, strChange
Loop Until objRecordset.EOF
Wscript.Echo objRecordSet.RecordCount & _
" User accounts " & strProperty & " changed to " & strChange
Note 1: Sorry for repeating the warning, but this script will alter
your users properties. However, I have chosen a relatively harmless property =
Note 2: By introducing the variable strChange it makes it a little
easier for you to edit the actual comment; it also makes it a lot easier to
display what the script did in the message box.
Note 3: Here is my challenge to you; carefully select another User
Property, then change the strProperty. Example strProperty =
Method use: changetype: modify
Even if you cannot get the 'unicodePwd' to work, you can at least master the
changetype: modify. Another bonus of doing this exercise is that you will learn
the strange syntax of the - (dash).
Assumption: You have a user
called Guy Thomas in the Worcester OU.
DC=cp to reflect yourdomain.
Note well : Syntax is
crucial. Observe carefully the single -
(dash) on line 5
Amendment: Change the
description below, then use notepad and save to a file: for example guydes.ldp
dn: CN=Guy Thomas, OU=Worcester,
At the command prompt type
LDIFDE -i -f
Check the properties of Guy
Thomas in Active Directory Users and Computers
Note if there is no - (Dash) on the last line, this
is the error you get.
There is a syntax error in the input file
Failed on line 4. The last token starts with 'P'.
The change-modify entry is missing the terminator '-'.
An error has occurred in the program
The disadvantage of LDIFDE is that it does not 'feed off' spreadsheets, and I
find the format a bit clunky. See more about LDIFDE here.
All good scripter need a 'Looping' command in their repertoire. Here we
investigate a simple loop to cut our teeth, then a more useful example to change
attributes in Active Directory.
See more about VBScript
• VBScripts • Ezines • WMI • Logon Scripts •
PowerShell Foreach •
• Ezine 1 Loops •
Ezine 14 Loops • Ezine 47 .put • PowerShell
Loops • Free
90 VBS Looping • Ezine 91 VBS Looping
• Ezine 92 LDIFDE • Ezine