Die PowerShell um Befehlskonstrukte erweitern

Die PowerShell ist wirklich sehr flexibel erweiterbar. Dank der Möglichkeit, einem Funktionsparameter einen Befehsblock übergeben zu können, auch um Befehlskontrukte. Ein Kleinigkeit, die mich schon öfter gestört hat ist der Umstand, dass es ein wenig umständlich ist eine Aktion auszuführen, wenn ein Pipeline-Objekt einen Where-Filter nicht erfüllt. Ich hätte gerne eine Art Where { Filter } { True-Part } { False-Part}-Konstrukt. Was bei VBScript&Co gänzlich undenkbar ist, ist bei der PowerShell keine allzu große Herausforderung:

function IfElse-Object
{
  param
  (
    [Parameter(Mandatory=$true,
               ValueFromPipeline=$true)]
    [Object[]]$InputObject,
    [Parameter(Position=0, Mandatory=$true)]
    [ScriptBlock]$Cond,
    [Parameter(Position=1, Mandatory=$true)]
    [ScriptBlock]$TruePart,
    [Parameter(Position=2, Mandatory=$true)]
    [ScriptBlock]$FalsePart
  )
  process
  {
   if (&$Cond)
   { &$TruePart }
   else { &$FalsePart }
  }
}

Während der InputObject-Parameter seinen Inhalt aus der Pipeline holt, erhalten die Parameter Cond, TruePart und FalsePart ihren Inhalt über die Werte, die beim Aufruf übergeben werden.

Als nächstes wird ein Alias definiert:

Set-Alias -Name IfElse -Value IfElse-Object

Aufgerufen wird der neue „Befehl“ wie folgt:

Get-Item -path *.* | IfElse { $_.Length -eq 0 } { „$($_.Name) ist leer“}  { „$($_.Name) ist nicht leer“ }

Ohne die neue Befehlskonstruktion wird es gleich ein wenig komplizierter, sofern man nicht auf die Standard-Lösung mit Foreach und einem „braven“ If-Befehl zurückgreifen möchte:

Get-Childitem -path *.* | &{ process { $Datei=$_.Name;switch ($_.Length) {{ $_ -eq 0} { „Datei $Datei ist leer“} { $_ -ne 0} { „Datei $Datei ist nicht leer“}}}}

Eine Antwort zu “Die PowerShell um Befehlskonstrukte erweitern

  1. Super Sache!

Schreibe einen Kommentar

Bitte logge dich mit einer dieser Methoden ein, um deinen Kommentar zu veröffentlichen:

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