PowerShell: Schweizer Taschenmesser für alle

PowerShellVöllig unstrittig: Egal ob Bash, Cmd oder PowerShell – es gibt nicht selten Situationen, in denen geht es ohne Kommandozeile schlicht und ergreifend nicht weiter.
Gelegentlich – glücklicherweise zunehmend seltener – wird man trotzdem noch vor die Frage gestellt, was denn nun der Sinn der PowerShell sei, habe man doch alle Möglichkeiten mit der guten, alten Cmd. Dem Aufgeklärten fallen sofort Schlagworte wie objektorientiert und .NET Framework aus dem Gesicht, doch für einen echten Mehrwert reicht das noch nicht ganz. Gerade wenn die PowerShell von Softwareentwicklern beworben wird, schalten ambitionierte Endanwender auch gerne mal in den „brauch-ich-doch-nicht-Modus“, da das Handwerkszeug zu überdimensioniert erscheint, doch ist es das ganz und gar nicht.

Ein paar Beispiele, die mir mit der Zeit sehr ans Herz gewachsen sind und die das Potential haben, das Tagewerk eines jeden Keyboard-Junkies etwas zu erleichtern, kurz und knapp zusammengetragen:

#1 Get-ChildItem: Wer sucht, der findet

Dateien suchen… irgendwo auf der Platte hatte ich sie aber wo? Alles was im Index steckt – wie z. B. Dateien in der Bibliotheken oder dem Home-Folder – ist unproblematisch aber wie finde ich schnell und verlässlich Dateien, die irgendwo in den Untiefen des Systems liegen?
Das dir-Command (genau wie ls) an der PowerShell ist eigentlich ein Alias für das Commandlet Get-ChildItem. Entscheidend ist der Parameter -Recurse, der das Commandlet instruiert in allen erreichbaren Ordnern in/unterhalb des aktuellen Ordners zu suchen. Der Parameter -Filter hilft beim Eingrenzen der gesuchten Dateien.

ls -Recurse -Filter "*.log"

Ist zudem noch der Inhalt der per Get-ChildItem gesuchten Dateien interessant, so hilft die Übergabe der Ergebnisse an Select-String.

ls -Recurse -Filter "*.log" | Select-String "Exception"

#2 In alten DOS-Tools stets Standard: Datei-Attribute modifizieren

Möchte man z. B. das Erstellungsdatum oder das Änderungsdatum von Dateien anpassen, so führte in Prä-PowerShell-Zeiten der Weg gerne über eine hastig improvisierte Konsolenanwendung, welche man bis zum nächsten Einsatz gleich wieder verlegt hatte oder gar über ein Stück zwielichtige Freeware. Mit System.IO.File und einem Einzeiler ist man hier schneller am Ziel.

[IO.File]::SetLastWriteTime("C:\config.sys", (New-Object DateTime 1992, 1, 1))
[IO.File]::SetCreationTime("C:\config.sys", (New-Object DateTime 1992, 1, 1))

#3 Ausgabe in einer Tabelle sortieren und filtern ohne Umwege über Excel

Alles, was im Konsolenfenster passiert, bleibt im Konsolenfenster. Zumindest die Struktur bei tabellarischer Ausgabe kommt leider bei Copy&Paste abhanden. Möchte man mit den Daten weiterarbeiten, schafft hier das Commandlet Out-GridView Abhilfe, welches ein separates Tool zur tabellarischen Darstellung einer jeden PowerShell-Ausgabe startet; hier am Beispiel der letzten 10 Einträge aus dem Eventlog.

Get-EventLog Application -Newest 10 | Out-GridView

#4 Prüfsummen: MD5- oder SHA-Hash schnell berechnet

Nicht nur um zu prüfen, ob eine Datei sich gegenüber einem früheren Zeitpunkt verändert hat, sondern auch um diverse vorkompilierte Binaries aus der OpenSource-Gemeinde auf ihre Authentizität hin zu prüfen, kommt man an MD5 und SHA-Hashes kaum vorbei. Ungünstig nur, wenn man kein Tool zur Hand hat, in welches man den jüngst erworbenen Download stopfen kann. Der Security.Cryptography-Namespace des .NET Framework mit seinen Crypto Service Providern ist hier eine geeignete Anlaufstelle.

# MD5 
[BitConverter]::ToString((New-Object Security.Cryptography.MD5CryptoServiceProvider).ComputeHash((New-Object IO.FileInfo("C:\Windows\write.exe")).OpenRead())).Replace("-","").ToLower()
# SHA
[BitConverter]::ToString((New-Object Security.Cryptography.SHA1CryptoServiceProvider).ComputeHash((New-Object IO.FileInfo("C:\Windows\write.exe")).OpenRead())).Replace("-","").ToLower()

#5 Es wird Zeit: Ticks und Timestamps

Häufig in Log-Dateien und Debugger-Ausgaben anzutreffen – Zeitstempel, die nicht auf den ersten Blick zielsicher im Kalender zuzuordnen sind. Mit einigen Bordmitteln bzw. statischen Methoden des .NET Typs DateTime kommt man den unterschiedlichsten Zeitangaben schnell auf die Schliche.

# Ticks in Datum/Zeit konvertieren 
[DateTime] 634539233533222331
# Datum/Zeit in Unix-Timestamp konvertieren
(([DateTime]::Now) - (New-Object DateTime 1970, 1, 1).ToLocalTime()).TotalSeconds
# Unix-Timestamp in Datum/Zeit konvertieren
(New-Object DateTime 1970, 1, 1).ToLocalTime().AddSeconds(1393023440)

Über Thomas Roschinsky
Software Engineer | .NET | SharePoint | Dynamics CRM | BI | C# | C/C++

4 Responses to PowerShell: Schweizer Taschenmesser für alle

  1. Hallo Thomas!

    Schöner Artikel!
    Auch ich bin .NET Developer und Administrator, also DevOPs😉
    Ich hatte hier in Braunschweig einen Vortrag PowerShell für .NET Devoloper gehalten.

    Besuch uns doch auf unsere deutschsprachigen PowerShell Community.

    gruss
    Peter Kriegel
    http://www.PowerShell-Group.eu

  2. Pingback: PowerShell für Developer | Thomas Roschinsky

  3. Pingback: Jahresrückblick 2014 | Thomas Roschinsky

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: