Just a comment from the perspective of an instructor...
 Code:
Function GetW7AVinfo(optional $machine)
dim $oSWbem,$colItems,$av[4],$colItem
 if not $machine $machine = "." endif
 
$Product= "AntiVirusProduct"
$Product= "AntiSpywareProduct"
$Product= "FirewallProduct"

 $oSWbem = GetObject("winmgmts:\\" + $machine + "\root\SecurityCenter2")
 If @Error exit @error EndIf
 For each $SelectStatement in $Product
contains errors as Lonk pointed out, but also is not as clear as it could be..

You have multiple products in an array, so declare (DIM!) the array of products (plural!)and define the array
 Code:
Dim $aProducts, $Product     ; array of products, enumerator var
$aProducts = 'prod 1', 'prod 2', 'prod 3'
Now you have an array that clearly indicates its content - a list of products, and a variable used to step through (enumerate) that list with a meaningful name - $Product.
 Code:
For Each $Product in $Products
The code is the same, but the clarity is improved.

Your loop
 Code:
For Each $ColItem in $colItems
is also unclear. The "col" in front of the "real" variable name Items ($colItems) implies that it is a collection of items from an object reference. $colItem isn't a collection, so the "col" prefix is misleading. A better form would be
 Code:
For Each $Item in $colItems
Again, you follow a singular/plural format for the enumeration, but don't imply that the enumerated object is a collection.

Simple syntax changes that make your code more readable and understandable, both to others and to your "future" self.

Glenn
_________________________
Actually I am a Rocket Scientist! \:D