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"))
    }
4

3 回答 3

57

'-replace' 进行正则表达式搜索,最后一个字符中有特殊字符(如 +),因此您可以使用非正则表达式替换版本,如下所示:

$c = $c.replace('AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA==')
于 2013-11-05T17:26:58.233 回答
7

如果你有 V3,你可以利用自动枚举、Get-Content 中的 -Raw 开关和一些新的行连续语法来简化它,使用字符串 .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() 方法对替换的文本参数(不是正则表达式)使用文字字符串,因此您无需担心在文本替换参数中转义正则表达式元字符。

于 2013-11-05T17:44:06.460 回答
5

在您的示例中,您在源字符串前面添加了目标字符串,AccountKey=但没有添加目标字符串。

$c = $c -replace 'AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','AccountKey=DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA=='

通过不将其包含在目标字符串中,生成的字符串将被删除AccountKey=而不是替换它。你用这个AccountName=例子正确地做到了这一点,这似乎支持这个结论,因为它没有给你任何问题。如果你真的想把它放在前面,那么这可能会解决你的问题。

于 2013-11-05T16:46:46.123 回答