2009-03-26 8 views
2

Ich versuche, Makroersatz basierend auf this discussion zu implementieren. Im Grunde funktioniert es, aber scheint die ExpandString einige limitatoins haben:

main.ps1:

$foo = 'foo' 
$text = [IO.File]::ReadAllText('in.config') 
$ExecutionContext.InvokeCommand.ExpandString($text) | out-file 'out.config' 

in.config (OK):

$foo 

in.config (Fehler: „Begegnet Ende die Linie, während der Verarbeitung eine Zeichenfolge token "):

" 

in.config (Error " Fehlende 'am Ende der Zeichenkette").:

' 

In der Dokumentation:

Return Value: The expanded string with all the variable and expression substitutions done.

Was Ausdruck Substitution "ist (kann sein, das ist mein Fall)?

Gibt es eine Umgehungslösung?

Antwort

3

Der Fehler tritt auf, weil die Anführungszeichen (Einzel- und Doppelzeichen) Sonderzeichen für die PowerShell-Laufzeit sind. Sie geben eine Zeichenfolge an, und wenn sie nur als das Zeichen verwendet werden sollen, müssen sie mit Escapezeichen versehen werden.

Eine mögliche Problemumgehung wäre es, Zitate mit einem Backtick zu entfernen, abhängig von Ihrem gewünschten Ergebnis.

Zum Beispiel, wenn meine Textdatei hatte

'$foo' 

Die daraus resultierende Erweiterung dieser Zeichenfolge

wäre
PS>$text = [io.file]::ReadAllText('test.config') 
PS>$ExecutionContext.InvokeCommand.ExpandString($text) 
$foo 

Wenn Sie diese Variable erweitert haben wollten, würden Sie diese Zitate entkommen müssen.

`'$foo`' 
PS>$text = [io.file]::ReadAllText('test.config') 
PS>$ExecutionContext.InvokeCommand.ExpandString($text) 
'foo' 

oder wenn Sie ein ungepaartes einfachen oder doppelten Anführungszeichen haben würden, würden Sie es fliehen müssen.

Sie könnten einen -Aufsatz an der Zeichenkette vornehmen, um diesen Zeichen zu entkommen, aber Sie müssen sicherstellen, dass dies der gewünschte Effekt auf der ganzen Linie ist.

PS>$single, $double = "'", '"'  
PS>$text = [io.file]::ReadAllText('test.config') -replace "($single|$double)", '`$1' 
PS>$ExecutionContext.InvokeCommand.ExpandString($text) 

HINWEIS: Nachdem Sie den ExpandString Anruf tun, werden Sie nicht die Backticks mehr rumhängen haben.

+0

Dies war eigentlich nur ein Fehler in PS2, der nun behoben ist: - / – Jaykul