我有一个脚本,我基本上在几个文本字符串上进行查找和替换。前几个字符串可以工作,但是当我使用帐户密钥时,他们却没有。我该如何解决这个问题?
这是脚本:
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"))
}
答案 0 :(得分:39)
' - 替换'进行正则表达式搜索,你在最后一个中有特殊字符(比如+) 所以你可以使用这样的非正则表达式替换版本:
$c = $c.replace('AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA==')
答案 1 :(得分: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()方法对替换的文本参数(不是正则表达式)使用文字字符串,因此您不必担心在text-to-replace参数中转义正则表达式元字符。
答案 2 :(得分:2)
在您的示例中,您的源字符串前缀为AccountKey=
,但不是您的目标字符串。
$c = $c -replace 'AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','AccountKey=DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA=='
如果不在目标字符串中包含该字符串,则生成的字符串将删除AccountKey=
而不是替换它。您正确地使用AccountName=
示例执行此操作,这似乎支持此结论,因为它没有给您任何问题。如果您真的想要预先设置,那么这可能会解决您的问题。