如何在PowerShell中使用运算符'-replace'来替换具有特殊字符的文本字符串并成功替换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在PowerShell中使用运算符'-replace'来替换具有特殊字符的文本字符串并成功替换相关的知识,希望对你有一定的参考价值。

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

这是脚本:

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"))
    }
答案

'-replace'进行正则表达式搜索,你在最后一个中有特殊字符(比如+)所以你可以使用这样的非正则表达式替换版本:

$c = $c.replace('AccountKey=eKkij32jGEIYIEqAR5RjkKgf4OTiMO6SAyF68HsR/Zd/KXoKvSdjlUiiWyVV2+OUFOrVsd7jrzhldJPmfBBpQA==','DdOegAhDmLdsou6Ms6nPtP37bdw6EcXucuT47lf9kfClA6PjGTe3CfN+WVBJNWzqcQpWtZf10tgFhKrnN48lXA==')
另一答案

如果你有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参数中转义正则表达式元字符。

另一答案

在您的示例中,您使用AccountKey=而不是目标字符串添加源字符串。

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

通过不在目标字符串中包含它,结果字符串将删除AccountKey=而不是替换它。你正确地使用AccountName=示例做了这个,这似乎支持这个结论,因为它没有给你任何问题。如果您真的想要预先设置,那么这可能会解决您的问题。

以上是关于如何在PowerShell中使用运算符'-replace'来替换具有特殊字符的文本字符串并成功替换的主要内容,如果未能解决你的问题,请参考以下文章

Hyper-V 2016 系列教程39 在 Windows 10中使用 Hyper-V 和 Windows PowerShell

在一元运算符' - '之后缺少表达式。在行:1 char:2

在Powershell中如何将日期'2017年6月6日,08:09:05.000'转换为[DateTime]?

如何使用 Windows 窗体在列表视图中显示 PowerShell 输出

Powershell 如何判断一个用户是否在一个用户组里面

Powershell中变量的定义和使用