如何替换字符串中的$(data)?

时间:2019-08-08 15:20:47

标签: powershell replace

我有一个名为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)替换路径,并且该路径在另一个文件中配置。在大多数情况下,它是完整的,但是在这种特殊的使用情况下,我必须为具有完整路径的某些实例/子配置配置它。

1 个答案:

答案 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