Beim Erstellen eines Scripts für einen Kunden habe ich in Sachen Powershell einiges dazugelernt.
- 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
- 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 - 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.
- 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. - 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.




[New Post] Lessons learn Powershell 1.0 – via @twitoaster http://www.roland-ehle.de/archives/1002
via Twitoaster