Gene Laisne's blog

IS&T / AD / Exchange / Scripting / other

Aug

17

PowerPing

By Gene Laisne

Recently I needed to check quickly if twelve systems were up. Rather than writeout each ping command I decided to user PowerShell to do all the heavy lifting. (I’ve been reading up on PowerShell recently)

What I did was write the names of the twelve systems into a text file and issue this command:

foreach ($comp in Get-Content c:\temp\hosts.txt) { ping $comp }

hosts.txt has one system listed per line and as the Get-Content parses the file, it sends each line to the ping command.

Another way would be this:

foreach ($comp in “system1″,”system2″,”system3”) { ping $comp}

On the internet you’ll see this example a lot of the time with something like “foreach ($num in 1,2,3,4,5)” This is nice, but numbers are not strings. If it’s a string, it needs to be in quotes!

If you have a collection of systems that are setup with incrementing DNS names you could do this:

foreach ($hostNumber in 1..10) {ping oit-computer$hostNumber}

This will ping each individual system in turn starting with oit-computer1 and finishing at oit-computer10. (Be sure to use two periods (..) to indicate a span of numbers.)

But, what if you number your systems with leading zeros? Try this trick:

foreach ($hostNumber in 1..10) {$Num = $hostNumber.ToString(“000”); ping OIT-Computer-$Num}

What’s happening here is we have two commands between the { } separated by ‘;’ Don’t forget the ‘;’ otherwise Powershell will error out with “Unexpected token ‘ping’ in expression or statement.” (Each individual element on the line is a token (foreach = token, ( = token, .. = token). First we take our number ($hostNumber) and set it to have leading zeros with the member function ToString(). If you want 4 leading zeros use “0000”.  The result of that change (from 5 to 005 and 10 to 010) goes into the variable $Num. We then use the $Num in the command, directly, without any additional quotes or concatinations. What you get is a series of your systems pinged one at a time.

Now, go a step further if you want, try these commands:

foreach ($hostNumber in 1..255) {$Num = $hostNumber.ToString(“000”); ping 10.100.25.$Num}
foreach ($hostNumber in 1..25) {$Num = $hostNumber.ToString(“000”); nslookup OIT-DSKTOP$Num}
foreach ($user in “gene”,”matt”,”steve”,”jane”) { mkdir \\server\users\$user }
foreach ($comp in “office”,”workstation”,”stevesPC”) { copy c:\temp\file.txt \\$comp\c$\temp }

Jun

11

vbscript starting point…

By Gene Laisne

Everybody needs a starting point. Now, I'm not going to teach you HOW to write scripts, think of this as more of a repository of useful scripts and script parts that I have gathered over the years.

First, I recomend using Edit Plus as your editor. It does great syntax highlighting, and it uses regular expressions in it's find, find and replace and other functions. Once you get used to it you'll wonder how you ever worked without it.

One great tool is the Microsoft script repository. Lots of little scripts to get you going. http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true. Also, you can look around the scriptcenter for some help.

For me, when I need to make a script I try to do it in pieces. I've built some functions and classes along with script templates where all I have to do is drop a few things in here or there and assemble the script. Makes things much easier.

Here are some of my basics. I start with a vbscript template. This gets me started. There are a collection of variables, objects and constants that I use on a reglar basis that are constant through out all my scripts. I recomend using a naming convention and keeping it as constant as possible. For me constants are in all caps, and all of my objects start with 'obj' as you'll see in the file. Also, my scripts have a header so I can keep track of changes that may have been made.

Help!

The next thing I do is drop in my help() function. This function is designed to require switches and if a user enters "/?", "-help", "--help" or any of a few other "help switches" they get the help output just like they were using a regular dos program.

There are two parts to this function. First, there is the help() function itself, which will need to be editied for you collection of switches, and then there is the parsing section of this template. The help() function, I always put at the end of the script, in fact, my scripts are all organized like this:

  1. Header
  2. Global variables (I know, you're not supposed to use global variables, but this is scripting... give me a break. Besides, if you careful, and know what you're doing this is fine.)
  3. Script
  4. Classes
  5. Functions

Now, the parsing portion of the scripts is setup to go through each argument to the script. The arguments are in an array so if you using a script that is exactly like the dos command 'copy" then you can make the first argument 'source' and the second argument 'destination.'  If, on the other hand, you were building a script like 'gpresult,' you would use the current argument to get the current switch, and the next argument (current index + 1) to specify the parameter.

Example:
objArgs is the argument object, this has all the arguments.
argCounter specifies the current index in the arguments.
So, "objArgs(argCounter)" references the current argument.
if "objArgs(argCounter)" is the current argument, then "objArgs(argCounter + 1) is the next argument.

So, if we wanted to use "/s <system name>" as an argument for our script, then in our select statement, we would have:

Select Case objArgs(argCounter)
    Case "/s"
        strSystem = objArgs(argCounter + 1)
End Select

So, that's the start of any good script. See the attached files.

funchelpvbs
vbscriptvbs