2

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

主.ps1:

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

in.config(确定):

$foo

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

"

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

'

该文档指出:

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

什么是“表达式替换”(可能是我的情况)?

有一些解决方法吗?

4

1 回答 1

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 调用后,您将不再有反引号。

于 2009-03-26T17:42:21.700 回答