NetSendAll Teil 2: PowerShell-Funktion ReadTextFile

URL dieses Beitrags: http://blog.stefan-macke.com/2008/05/02/netsendall-teil-2-powershell-funktion-readtextfile/

Der heutige Artikel ist der zweite in meiner kleinen Reihe zum PowerShell-Skript NetSendAll, mit dem ich allen PCs unseres Netzwerkes über unterschiedliche Subnets hinweg mittels net send eine Nachricht schicken kann.

Gestern habe ich die Funktion PingPC vorgestellt, die einen einzelnen PC anpingt. Doch woher bekomme ich nun die Info, welche PCs überhaupt angepingt werden sollen? Ganz einfach: Aus einer simplen Textdatei. Diese kann z.B. mittels eines weiteren PowerShell-Skripts mit den PC-Namen aus dem Active Directory gefüllt, oder händisch angelegt werden. Es könnte bspw. so aussehen:

#columns;Name;IP;MAC
macke;192.168.100.1;ab-cd-ef-ab-cd-ef
macke2;192.168.100.2;ab-cd-ef-ab-cd-f0

Die erste Zeile definiert mir dabei die Informationen, die in jeder folgenden Zeile kommasepariert enthalten sind (PC-Name, IP und MAC). Aus jeder folgenden Zeile der Datei erstellt meine Funktion ReadTextFile jetzt ein anonymes Objekt mit Attributen, deren Bezeichner den in der ersten Zeile definierten entsprechen, also z.B.:

$pc # das anonyme Objekt
$pc.Name # ein Attribut "Name", das für die zweite Zeile "macke" enthalten würde
$pc.IP
$pc.MAC

So kann ich komfortabel auf die in der Textdatei enthaltenen Werte zugreifen und sie weiterverarbeiten. Sollte die erste Zeile fehlen, werden die Spalten einfach nach dem Schema col1, col2 etc. durchnummeriert.

  1. # Reads the content of a textfile and returns the lines as anonymous objects with named attributes.
  2. # Lines starting with "#" are ignored (comments).
  3. # If the first line starts with "#columns" the following values are taken as attribute names for the anonymous objects,
  4. # otherwise they will be named col1, col2, etc.
  5. function ReadTextFile($filename)
  6. {
  7.         if (!(test-path $filename))
  8.         {
  9.                 write-host ("File not found: " + $filename) -foregroundcolor "red";
  10.                 exit;
  11.         }
  12.         $contents = @();
  13.         $lineCounter = 0;
  14.         $c = get-content $filename;
  15.         foreach ($line in $c)
  16.         {
  17.                 if ($line -ne $null -and $line.trim() -ne "")
  18.                 {
  19.                         $lineCounter++;
  20.                         # read column headers
  21.                         if ($lineCounter -eq 1)
  22.                         {
  23.                                 if ($line.startsWith("#columns;"))
  24.                                 {
  25.                                         $headers = $line.substring("#columns;".length, ($line.length - "#columns;".length)).split(";");
  26.                                 }
  27.                                 else
  28.                                 {
  29.                                         $colCounter = $line.split(";").count;
  30.                                         $headers = @();
  31.                                         for ($i = 0; $i -lt $colCounter; $i++)
  32.                                         {
  33.                                                 $headers += ("col" + $i);
  34.                                         }
  35.                                 }
  36.                         }
  37.                         # create anonymous object from line
  38.                         if (!$line.startsWith("#"))
  39.                         {
  40.                                 # create object with header names as properties
  41.                                 $l = "" | select-object $headers;
  42.                                 $c = $line.split(";");
  43.                                 for ($i = 0; $i -lt $headers.count; $i++)
  44.                                 {
  45.                                         $l.($headers[$i]) = $c[$i];
  46.                                 }
  47.                                 $contents += $l;
  48.                         }
  49.                 }
  50.         }
  51.         return $contents;
  52. }

Beispielausgabe der PowerShell-Funktion ReadTextFile

Morgen geht es dann weiter mit der letztlichen Funktion NetSendAll.

Füge diesen Artikel zu deinen Bookmarks hinzu Diese Icons verzweigen auf soziale Netzwerke bei denen Nutzer neue Inhalte finden und mit anderen teilen können.
  • del.icio.us
  • bodytext
  • MisterWong
  • Reddit
  • Technorati
  • Spurl
  • description

Kommentar zu diesem Beitrag

  1. Gravatar NetSendAll Teil 3: PowerShell-Script NetSendAll » Stefan Macke
    Am 3. May 2008 um 10:16 Uhr

    [...] Impressum « NetSendAll Teil 2: PowerShell-Funktion ReadTextFile [...]

Einen Kommentar schreiben

XHTML: Diese Tags sind erlaubt: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>