$ macro substitution - ограничения ExpandString - PullRequest
2 голосов
/ 26 марта 2009

Я пытаюсь реализовать замену макросов на основе этого обсуждения . В основном это работает, но кажется, что у ExpandString есть некоторые ограничения:

main.ps1:

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

in.config (OK):

$foo

in.config (Ошибка: «Обнаружен конец строки при обработке строкового токена.»):

"

in.config (Ошибка: «отсутствует» в конце строки.):

'

В документации говорится:

Возвращаемое значение: расширенная строка со всей переменной и выражением замены сделаны.

Что такое «подстановка выражений» (может быть, это мой случай)?

Есть ли какое-нибудь решение?

1 Ответ

3 голосов
/ 26 марта 2009

Ошибка возникает из-за того, что кавычки (одинарные и двойные) являются специальными символами среды выполнения PowerShell. Они указывают на строку, и если они должны использоваться только в качестве этого символа, их необходимо экранировать.

Возможный обходной путь - экранирование кавычек с обратной косой чертой в зависимости от желаемого результата.

Например, если мой текстовый файл имел

'$foo' 

Результирующее расширение этой строки будет

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

Если вы хотите расширить эту переменную, вам нужно экранировать эти кавычки.

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

или если вы собираетесь получить непарную одинарную или двойную кавычку, вам нужно будет ее избежать.

Вы можете сделать -замену на строке, чтобы избежать этих символов, но вы должны будете убедиться, что это желаемый эффект по всем направлениям.

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

ПРИМЕЧАНИЕ. После того, как вы выполните вызов ExpandString, у вас больше не будет бэкстиков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...