Mittwoch, 9. März 2016

Erstellen einer StringCollection in PowerShell, OutputType und unrolling

Im SharePoint-Kontext benötigt man immer mal wieder eine StringCollection (System.Collections.Specialized.StringCollection). Um diese zu erstellen wollte ich "kurz" eine PowerShell-Funktion dazu erstellen. Drei Punkte habe ich dabei gelernt:
  1. Der OutputType einer Funktion wird nur für Autovervollständigung z.B. in der ISE benutzt. Der "wirkliche" Rückgabe-Typ entspricht immer der eigentlichen Rückgabe zur Laufzeit.
  2. Rückgaben, die eine Auflistung sind werden "unrolled". D.h. diese erscheinen in der Rückgabe dann als normales Array.
  3. "unrolling" kann in der Rückgabe verhindert werden wenn dieser ein Komma vorgestellt wird. (Also "return ,$foo;" - reichlich komisch...)
Der Code im Ergebnis sieht dann so aus:
function Create-StringCollection {
   <#
      .SYNOPSIS
        Creates a StringCollection from a array of strings

      .PARAMETER txt
        strings to convert

      .EXAMPLE
        @("foo", "bar") | Create-StringCollection
   #>
   [CmdletBinding()]
   [OutputType([System.Collections.Specialized.StringCollection])]
   param (
      [Parameter(Mandatory=$true, ValueFromPipeline=$True)]
      [string[]]$txt
   )
   Begin {
      $coll = New-Object System.Collections.Specialized.StringCollection;
   }
   Process {
      $coll.Add($txt) | Out-Null;
   }
   End {
      ,$coll; # hack to prevent powershell from "unrolling" the enumerable
   }
}

Keine Kommentare:

Kommentar veröffentlichen