$ macro替换 - ExpandString限制

时间:2009-03-26 15:49:41

标签: powershell macros

我正在尝试基于this discussion实现宏替换。基本上它可以工作,但似乎ExpandString有一些限制:

main.ps1:

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

in.config(确定):

$foo

in.config(错误:“处理字符串标记时遇到行尾”。):

"

in.config(错误:字符串末尾“缺少”。):

'

文档说明:

  

返回值:扩展字符串   包含所有变量和表达式   替换完成。

什么是'表达替换'(这可能是我的情况)?

是否有一些解决方法?

1 个答案:

答案 0 :(得分:3)

发生错误是因为引号(单引号和双引号)是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'

或者如果你打算使用不成对的单引号或双引号,你需要逃避它。

您可以对字符串执行-replace以逃避这些字符,但您必须确保这是所需的效果。

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

注意:在执行ExpandString调用之后,您将不再需要反引号。