Warum muss ich das letzte einzelne Anführungszeichen in dieser Powershell-Here-Zeichenfolge entziehen?

591
Bram

Nach Powershell " über Zitierregeln ":

Ein Here-String ist ein String mit einfachen oder doppelten Anführungszeichen, in dem Anführungszeichen wörtlich interpretiert werden.

Die folgende Here-Zeichenfolge führt jedoch zu einer TerminatorExpectedAtEndOfString-Ausnahme in Powershell Version 5.0 (Build 10586, Revision 117). In einer Powershell-Version 2.0 funktioniert es wie erwartet:

$herestr=@" '"' "@ Write-Host $herestr 

Wenn ich das letzte einzelne Anführungszeichen mit einem Backtick (`) zitiere, funktioniert der Here-String in Version 2.0 und 5.0 wie erwartet.

$herestr=@" '"`' "@ Write-Host $herestr 

Warum muss ich das letzte einzelne Anführungszeichen in einer Here-Zeichenfolge kennzeichnen?

1
IMHO, es ist ein Fehler im PowerShell-Parser. Wenn Sie sich im Anweisungsanalysemodus befinden, versuchen Sie zuerst, das erste Zeichen als `BareWord'-Stringliteral zu interpretieren. Und wenn es fehlgeschlagen ist, wird ein Fehler ausgegeben. Sie können dieses Problem umgehen, indem Sie zusätzlichen Speicherplatz angeben: `$ herestr = @" ... `oder` $ herestr = @ "...`; oder indem Sie in Klammern einschließen: `($ herestr = @" ... "@)`. PetSerAl vor 7 Jahren 1
@ PetSerAl: danke für die Rückmeldung. Wissen Sie, ob dieser Fehler bekannt ist oder sollte ich ihn melden? Bram vor 7 Jahren 0
Ich denke, Ihr Fehler hat die gleiche Ursache wie [dieser] (https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/12531978-bug-in-variable-assignment-parser). PetSerAl vor 7 Jahren 0
@PetSerAl: danke: Ich habe auch ein Problem auf github erstellt, da nicht klar ist, ob das uservoice-Forum noch verwendet wird: https://github.com/PowerShell/PowerShell/issues/2780. Wenn Sie die von Ihnen aufgeführten Problemumgehungen als Antwort veröffentlichen, akzeptiere ich sie. In der Zwischenzeit habe ich herausgefunden, dass der Posh-Styleguide empfiehlt, Leerzeichen vor und nach den Gleichheitszeichen zu verwenden, um den Fehler zu beheben. Bram vor 7 Jahren 0

1 Antwort auf die Frage

1
PetSerAl

Ich glaube, es ist ein Fehler im PowerShell-Parser. Es sieht so aus, als würde es im Anweisungsanalysemodus zuerst versuchen, das erste als BareWordZeichenkettenliteral zu interpretieren . Und wenn es fehlgeschlagen ist, wird ein Fehler ausgegeben. Sie können dieses Problem umgehen, indem Sie vor oder nach dem Gleichheitszeichen ein zusätzliches Leerzeichen einfügen:

$herestr =@" '"' "@ 

oder

$herestr= @" '"' "@ 

Oder mit Klammern:

[void]($herestr=@" '"' "@) 

Da Klammern keine Zuweisung oder Inkrementierung / Dekrementierung sind, schreiben sie das Ergebnis eines Ausdrucks in die Pipeline, im Gegensatz zum bloßen Zuweisungsausdruck. Daher müssen Sie es explizit mit [void]oder einer anderen Methode ignorieren .