我有一个名为configuration.xml
的配置文件,它看起来像:
<?xml version="1.0" encoding="utf-8" ?>
<Configuration xmlns="http://tempuri.org/Configuration.xsd">
<Icons>
<Icon name="about" file="$(data)\more\data\about.png" />
<Icon name="help" file="$(data)\more\data\help.png" />
</Icons>
</Configuration>
要将这些配置文件部署到不同的环境中,我想使用Powershell脚本(当前为5),该脚本应将$(data)
替换为真实路径-environment\path\to\data
。
我的脚本的简短版本如下:
$file = Get-Item '.\configuration.xml'
$content = ($file | Get-Content)
# file="$(data)\more\data" => file="environment\path\to\data\more\data"
$content = $content -replace '$(data)', 'environment\path\to\data'
$content | Set-Content $file.FullName
我尝试使用单引号对$
进行转义,并且还尝试通过使用反引号对双引号进行转义
"`$(data)"
,但这不起作用。
尝试使用Unicode "$([char]0x0024)(data)"
来解决它也不成功。
有人可以指出我的解决办法吗?
旁注
我想更改$(data)
,但这是第3部分库的一部分,我不能更改。第三部分库使用$(data)
替换路径,并且该路径在另一个文件中配置。在大多数情况下,它是完整的,但是在这种特殊的使用情况下,我必须为具有完整路径的某些实例/子配置配置它。
答案 0 :(得分:4)
使用-replace
运算符时,正则表达式用于匹配字符串。正则表达式匹配的字符串被文字字符串替换,但有一些例外。常规语法如下:
$strings -replace $regex,$stringliteral
正则表达式必须遵循正则表达式转义规则,而不是PowerShell转义规则。正则表达式转义字符为\
。由于$()
是正则表达式中的特殊字符,因此您的正则表达式必须为\$\(data\)
。您可以通过正则表达式Escape()
方法自动为您完成此操作。
$file = Get-Item '.\configuration.xml'
$content = ($file | Get-Content)
$content = $content -replace [regex]::Escape('$(data)'), 'environment\path\to\data'
$content | Set-Content $file.FullName