如何在PowerShell中使用运算符“-replace”成功替换包含特殊字符的文本字符串

25

我有一个脚本,在其中基本上对几个文本字符串进行查找和替换。前几个字符串可以工作,但是当我执行帐户密钥时,它们不起作用。我该如何解决这个问题?

以下是脚本:

Get-ChildItem "[FILEPATH]" -recurse |
    Foreach-Object {
        $c = ($_ | Get-Content)
        $c = $c -replace 'abt7d9epp4','w2svuzf54f'
        $c = $c -replace 'AccountName=adtestnego','AccountName=zadtestnego'
        $c = $c -replace 'AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA=='
        [IO.File]::WriteAllText($_.FullName, ($c -join "`r`n"))
    }

2
它“不工作”的方式是什么?如果您能更具体一些,人们可能会更好地回答您的问题。 - Keith Hill
3个回答

57

'-replace'执行正则表达式搜索,而您在最后一个搜索项中有特殊字符(比如+)。因此,您可以像这样使用非正则表达式的替换版本:


'-replace'执行正则表达式搜索,而您在最后一个搜索项中有特殊字符(比如+)。因此,您可以像这样使用非正则表达式的替换版本:
$c = $c.replace('AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA==')

7
如果您使用V3版本,则可以利用自动枚举、Get-Content中的-Raw开关以及一些新的行连续语法,将其简化为以下形式,并使用字符串.replace()方法替换-replace运算符:
(Get-ChildItem "[FILEPATH]" -recurse).FullName |
  Foreach-Object {
   (Get-Content $_ -Raw).
     Replace('abt7d9epp4','w2svuzf54f').
     Replace('AccountName=adtestnego','AccountName=zadtestnego').
     Replace('AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','AccountKey=DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA==') |
   Set-Content $_
  }

使用.replace()方法时,替换文本参数使用字面字符串(不是正则表达式),因此您无需担心在要替换的文本参数中转义正则表达式元字符。


5
在您的示例中,您在源字符串前面添加了AccountKey=,但没有在目标字符串中添加。
$c = $c -replace 'AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','AccountKey=DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA=='

如果不在目标字符串中包含此内容,则生成的字符串将删除AccountKey = 而不是替换它。对于AccountName = 示例,您已正确执行此操作,这似乎支持此结论,因为它没有给您带来任何问题。如果您确实想要将其前置,则可能会解决您的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接