我正在尝试基于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(错误:字符串末尾“缺少”。):
'
文档说明:
返回值:扩展字符串 包含所有变量和表达式 替换完成。
什么是'表达替换'(这可能是我的情况)?
是否有一些解决方法?
答案 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调用之后,您将不再需要反引号。