Archive

Abonnieren

Countdown

    Keine Ereignisse vorhanden

Lessons learnt Powershell 1.0

Beim Erstellen eines Scripts für einen Kunden habe ich in Sachen Powershell einiges dazugelernt.

  1. Powershell und MySQL
    Mit Powershell lassen sich auch Abfragen auf MySQL Datenbanken generieren. Benötigt wird dafür der .NET MySQL Connector. Aus dem heruntergeladenen Paket wird die Datei MySql.Data.dll benötigt, diese habe ich im Script-Verzeichnis abgelegt. Der Code für eine Abfrage sieht dann z.B. so aus:

    # get the script’s execution path
    $myPath = Split-Path -Parent $MyInvocation.MyCommand.Path;
    # load MySQL driver and query database
    [void][system.reflection.Assembly]::LoadFrom($myPath + "\MySQL.Data.dll");
    $Yesterday = (get-date -date ((get-date).AddDays(-1)) -uFormat%Y-%m-%d”);
    function getDatafromDb($q)
    {
     
    # the connection string used to connect to the database
    $connString = "Server=server;Database=mailscanner;Uid=mailwatch;Pwd=password";
     
    $conn = New-Object MySql.Data.MySqlClient.MySqlConnection;
    $conn.ConnectionString = $connString;
    $conn.Open();
    $command = New-Object MySql.Data.MySqlClient.MySqlCommand;
    $command.Connection = $conn;
    $command.CommandText = $q;
    $reader = $command.ExecuteReader();
    while($reader.Read())
    {
    $script:results = $reader.GetString(0);
    }
    $conn.Close();
    }
     
    $qAnzahl = "SELECT Count(*) FROM maillog where date='$Yesterday'";
    getDatafromDB $qAnzahl
    $ganzahl = $results

    Quelle: Blog Stefan Macke

  2. Geltungsbereich von Variablen
    Variablen können in Powershell unterschiedliche Geltungsbereiche haben. Unterschieden wird zwischen local (Standard), script und global.  Um den Geltungsbereich einer Variable z.B. auf script festzulegen, muss dem Variablennamen beim Anlegen ein $script: vorangestellt werden (Siehe obiges Beispiel: $script:results). Der spätere Zugriff auf die Variable erfolgt wie gehabt ohne Zusätze, also z.B. $results

  3. Ausgabeprobleme bei PSObject
    Mit PSObject zu arbeiten ist dann erforderlich, wenn verschiedene Ergebnisse eines Scriptdurchlaufs für eine spätere Ausgabe gesammelt werden sollen, Beispiel:

    $obj = new-object psObject
    $obj |Add-Member -MemberType noteproperty -Name "Exchange" -value "Werte"
    $obj |Add-Member -MemberType noteproperty -Name "Datum" -Value $Yesterday
    $obj |Add-Member -MemberType noteproperty -Name "Anzahl Gesendete E-Mails Exchange" -Value $msend.Count

    Wenn auf diese Art viele Werte gesammelt werden, kann die Ausgabe mit convertto-HTML etwas unübersichtlich werden, weil alle Members in Spalten ausgegeben werden. Um die Pärchen bestehend aus dem jeweiligen Namen und dazugehörigem Wert untereinander auszugeben, habe ich mir wie folgt beholfen:

    Ausgabe von $obj per Out-File in eine Textdatei. Anschließend müssen aus der Textdatei die leeren Zeilen, die überzähligen Leerzeichen entfernt werden und der Doppelpunkt durch Komma ersetzt werden. So ist es möglich die überarbeitete Textdatei mit import-csv in eine Variable zu lesen und eine saubere Ausgabe in eine HTML-Datei zu verwirklichen.

  4. Mit Strings kann man nicht rechnen
    Werden durch eine Datenbankabfrage Zahlen geliefert, werden diese durch die Powershell als Strings behandelt. Folge: Mit den Werten kann keine Rechenoperation durchgeführt werden. Stellt man [int] vor den Variablennamen, erfolgt eine Behandlung als Integer und somit sind auch Rechenoperationen möglich.
  5. Import-CSV in Powershell 1.0 und Zahlenformate
    Enhält eine Datei, die mit Import-CSV importiert werden soll Dezimalzahlen, wird beim deutschen Gebietsschema das Komma als Trennzeichen verwendet. Dies führt leider zu Problemen beim Import, weil Nachkommastellen dann als neue “Spalte” behandelt werden. Leider kennt der Befehl Import-CSV in Powershell 1.0 noch nicht den Parameter -Delimiter um ein anderes Trennzeichen als Komma verwenden zu können. Hier hilft nur der Workaround die Kommas der Dezimalzahlen vor einem Import durch einen Punkte zu ersetzen.

Verwandte Artikel

1 comment to Lessons learnt Powershell 1.0

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

Comment Spam Protection by WP-SpamFree