2009-03-26 7 views
2

J'essaye d'implémenter le macro-remplacement basé sur this discussion. Fondamentalement, cela fonctionne, mais semble le ExpandString ont quelques limitatoins:

main.ps1:

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

in.config (OK):

$foo 

in.config (erreur: « fin Rencontrés de la ligne lors du traitement d'un jeton de chaîne "):

" 

in.config (erreur: " manquant "en fin de chaîne").:

' 

Les états de documentation:

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

Quelle est la 'substitution d'expression' (peut-être ceci est mon cas)?

Y a-t-il une solution de contournement?

Répondre

3

L'erreur se produit car les guillemets (simple et double) sont des caractères spéciaux pour l'exécution de PowerShell. Ils indiquent une chaîne et s'ils doivent être utilisés comme ce seul caractère, ils doivent être échappés.

Une solution de contournement possible serait d'échapper les guillemets avec un backtick, en fonction de votre résultat souhaité.

Par exemple, si mon fichier texte avait

'$foo' 

L'expansion résultant de cette chaîne serait

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

Si vous vouliez avoir cette variable étendue, vous devez échapper à ces citations. Ou si vous deviez avoir une citation simple ou double non appariée, vous auriez besoin d'y échapper.

Vous pouvez faire un -replace sur la chaîne pour échapper ces caractères, mais vous devrez vous assurer que c'est l'effet désiré sur toute la carte.

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

REMARQUE: Une fois que vous faites l'appel ExpandString, vous n'aurez pas les accents graves traîner plus.

+0

C'était en fait juste un bug dans la PS2 qui est maintenant corrigé: - / – Jaykul