Zum Hauptinhalt springen

Texte umschliessen und kommaseparierte Listen erstellen

Ein häufig auftretendes Problem ist das Umschliessen von Texten z.B. mit Anführungszeichen. Für Transact-SQL gibt es dafür sogar eine eigene Funktion, Quotename, die das übernimmt. In Powershell fehlt diese Funktion zwar, sie lässt sich aber durch den Format-Operator -f sehr einfach nachrüsten. Der Format-Operator kann in einen String beliebige Texte einfügen. Im Text werden dafür Platzhalter definiert. Ein Platzhalter ist eine Zahl, die in geschweifte Klammern eingeschlossen ist, z.B. {0}. Hinter dem Text folgt der Format-Operator -f, wiederum gefolgt von den Werten, die in die Platzhalter eingefügt werden sollen:

'Dies ist ein {0} Text mit {2} Platzhaltern, der als {1} dient' -f "sinnloser","Beispiel","drei"

Das Prinzip ist sehr einfach. Hinter dem -f folgen 3 Strings, die durch Kommas getrennt sind. Die Strings werden von 0 ab durchgezählt und in die entsprechenden Platzhalter eingefügt. Das Ergebnis lautet also:

Dies ist ein sinnloser Text mit drei Platzhaltnern, der als Beispiel dient.

Das kann man sich zunutze machen, um Texte einfach mit beliebigen Zeichen zu umschliessen:

'{1}{0}{1}' -f 'Eingabe',"''"

Logischerweise kann man das auch in der Pipeline nutzen, um z.B. Daten aus einer Textdatei zu umschliessen, oder im folgenden Beispiel einfach für ein paar Zahlen:

1..10 | foreach-object { '{1}{0}{1}' -f $_,"''" }
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'10'

Jetzt wäre es noch schön, wenn wir den Text nicht als Einzelzeichen bekommen würden, sondern Komma-separiert. Hierfür ist der -join Operator sehr hilfreich, der einfach mehrere Eingaben mit einem Trennzeichen zusammenfügt. Um den join-Operator nutzen zu können, muss die Eingabeliste aber erst mal vollständig erzeugt werden. Daher speichern wir die vorige Ausgabe erst in ein Array und fügen die Werte anschließend zusammen:

$Zahlenarray = 1..10 | foreach-object { '{1}{0}{1}' -f $_,"`'" }
$zahlenarray -join ','

Alternativ können wir das Ergebnis auch in einer Zeile erzeugen:

( 1..10 | foreach-object { '{1}{0}{1}' -f $_,"''" }) -join ','