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.

# Reads the content of a textfile and returns the lines as anonymous objects with named attributes. # Lines starting with "#" are ignored (comments). # If the first line starts with "#columns" the following values are taken as attribute names for the anonymous objects, # otherwise they will be named col1, col2, etc. function ReadTextFile($filename) { if (!(test-path $filename)) { write-host ("File not found: " + $filename) -foregroundcolor "red"; exit; } $contents = @(); $lineCounter = 0; $c = get-content $filename; foreach ($line in $c) { if ($line -ne $null -and $line.trim() -ne "") { $lineCounter++; # read column headers if ($lineCounter -eq 1) { if ($line.startsWith("#columns;")) { $headers = $line.substring("#columns;".length, ($line.length - "#columns;".length)).split(";"); } else { $colCounter = $line.split(";").count; $headers = @(); for ($i = 0; $i -lt $colCounter; $i++) { $headers += ("col" + $i); } } } # create anonymous object from line if (!$line.startsWith("#")) { # create object with header names as properties $l = "" | select-object $headers; $c = $line.split(";"); for ($i = 0; $i -lt $headers.count; $i++) { $l.($headers[$i]) = $c[$i]; } $contents += $l; } } } return $contents; }

Beispielausgabe der PowerShell-Funktion ReadTextFile

Morgen geht es dann weiter mit der letztlichen Funktion NetSendAll.

Über Stefan

Polyglot Clean Code Developer

Ein Kommentar

  1. Pingback:NetSendAll Teil 3: PowerShell-Script NetSendAll » Stefan Macke

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax