Blogbeitrag

06 | 06 | 2016

PowerShell Quirk: Here-Strings und Zeilenumbrüche.

Geschrieben von um 21:51 Uhr

Neulich im TechNet-Forum: Jemand beschwerte sich darüber, dass der folgende Code an der Konsole „True“ ausgibt, über Skriptausfürhung (ISE, Task Scheduler, Mit PowerShell ausführen) dagegen „False„:

$list = @"
blah1
blah2
"@ -split "`n"

$cmd = "`"$($list[-2])`" -eq `"blah1`""
"$cmd`: $(invoke-expression $cmd)"

Der Grund dafür ist einfach und wird mehr oder weniger sofort ersichtlich, wenn man den folgenden Code an der Konsole und in der ISE ausführt:

$list = @"
blah1
blah2
"@
[int[]]([char[]]$list)

An der Konsole ist am Ende der ersten Zeile ein NewLine, ASCII(10) also. Und nur das. In der ISE (oder wenn wir das Skript abspeichern und ausführen), sehen wir hingegen die für Windows-Textdateien übiche CR+LF-Kombi (ASCII(13) + ASCII(10)). Durch das Splitten nach „`n“ (ASCII(10)) bleibt die unsichtbare 13 stehen und führt dazu, dass der exakte Vergleich scheitert.

Eine Lösung könnte sein, die CR’s herauszufiltern:

$list = (@"
blah1
blah2
"@ -replace "`r","") -split "`n"

oder

$list = (@"
blah1
blah2
"@ -split "`n") | foreach { $_ -replace "`r","" }

Meine übliche Lösung ist, für so etwas keine Here-Strings zu verwenden, sondern Arrays einfach explizit zu deklarieren. Um der Lesbarkeit Willen kann man das trotzdem schön anordnern:

$list = @("blah1"
         ,"blah2")

Beitragsdetails

Tags » , , , «

gravatar

Kategorie » Allgemein «

Trackback: Trackback-URL |  Kommentar-Feed: RSS 2.0 | 250 Worte

Beitrag kommentieren

Kommentar schreiben ...

Deine E-Mail-Adresse wird nicht veröffentlicht.

(X)HTML Tags zur Formatierung der Kommentare

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>