无法通过PowerShell在文本文件中使用加号“+”来编辑/replacestring值

我正在尝试更新一组基于XML的.config文件。 文件中有一个string,它包含一个我不能用我的脚本replace的加号:

< SharedPassKey=123456789abcdefghi/JKLM+nopqrst= /> 

如果我加上加号,那么脚本什么也不做。 由于所有的configuration不同,我需要replace文本 – 不能只是用新的文件。

所需的结果是文件中的匹配值被replace为指定的值,但+符号不允许这样做。 这是我的PS脚本:

 $DIRs = Get-ChildItem -Path "C:\TEST" -Directory Get-ChildItem $DIRs -File -Recurse -Filter *.config | ForEach { (Get-Content $_.FullName) | ForEach { $_ -replace '< SharedPassKey=123456789abcdefghi/JKLM+nopqrst= />','< SharedPassKey=123456789abcdefghi/JKLM.nopqrst= />' } | Set-Content $_.FullName } 

作为一个testing,我把所有的文本都replace成了加号,并且工作正常,但是在新文本的末尾出现了加号和下面的字符,因为我已经把脚本中的“+ nopqrst”留下了。

在PSv3上运行,FYI。

-replace运算符使用第一个后​​缀参数的正则表达式来定义搜索模式。 在正则表达式中,某些字符有特殊的含义 。 +尤其是一个所谓的“量词”,意思是“一个或多个前面的(子)表达”。 为了替换文字特殊字符,你需要转义它们。

幸运的是,有一个转义字符串的内置方法 :

 $_ -replace [RegEx]::Escape('< SharedPassKey=123456789abcdefghi/JKLM+nopqrst= />'),'< SharedPassKey=123456789abcdefghi/JKLM.nopqrst= />' 

如果您有有效的XML数据,并且想要修改XML文件中节点属性的值,则可以考虑使用正确的XML解析器,如下所示:

 $xmlfile = 'C:\path\to\your.config' [xml]$xml = Get-Content $xmlfile $attr = $xml.SelectSingleNode('//somenode/@SharedPassKey') $attr.'#text' = $attr.'#text'.Replace('+', '.') $xml.Save($xmlfile) 

使XPath表达式适合于选择特定的属性。 这将允许你用a替换+ . 只是在这个属性。