如何使用PowerShell替换多个字符串

4

我想将4个字符串替换为另外4个字符串,并将它们写入文件。

$file = 'C:\Defender.psd1'
(Get-Content $file) | ForEach-Object {
    $_.replace("'MSFT_MpSignature.cdxml',", "'MSFT_MpSignature.cdxml')")
    $_.replace("'MSFT_MpWDOScan.cdxml')", "")
    $_.replace("'Remove-MpThreat',", "'Remove-MpThreat')")
    $_.replace("'Start-MpWDOScan')", "") `
} | Out-File $file

但是文件中的每个字符串都被复制了4次,这并不是我们想要的。该脚本将用于PowerShell 4和5.1。

2个回答

5

这是因为您将当前的foreach对象放入管道中四次。相反,只需执行一次并多次调用替换操作:

$file = 'C:\Defender.psd1'
(Get-Content $file) | ForEach-Object {
    $_.replace("'MSFT_MpSignature.cdxml',", "'MSFT_MpSignature.cdxml')").replace("'MSFT_MpWDOScan.cdxml')", "").replace("'Remove-MpThreat',", "'Remove-MpThreat')").replace("'Start-MpWDOScan')", "") `
} | Out-File $file

这里有一份更易懂的版本:

$file = 'C:\Defender.psd1'

(Get-Content $file) | ForEach-Object {
    $_.replace("'MSFT_MpSignature.cdxml',", "'MSFT_MpSignature.cdxml')").
    replace("'MSFT_MpWDOScan.cdxml')", "").
    replace("'Remove-MpThreat',", "'Remove-MpThreat')").
    replace("'Start-MpWDOScan')", "") 
} | Out-File $file

那么,即使一行太长,总是写在同一行中是否正确? - farag
@farag 这取决于情况,但通常我会尽可能使脚本易读,例如避免使用别名,并将语句拆分成多行。我还为您提供了一个更易读的版本。 - Martin Brandl

2
感谢 @Martin Brandl 的回答,它完美地运行了,但我在 CI/CD 中遇到了一些问题。我的流水线对文件编码很敏感。原始文件是 UTF-8,但 "Out-File" 将其更改为 "UCS-2 BOM"
因此,我不得不将文件保存代码替换为 "Set-Content -Path $file",它保留了原始编码。
以下是完整的示例:
$file = 'C:\Defender.psd1'
(Get-Content $file) | ForEach-Object {
    $_.replace("'MSFT_MpSignature.cdxml',", "'MSFT_MpSignature.cdxml')").replace("'MSFT_MpWDOScan.cdxml')", "").replace("'Remove-MpThreat',", "'Remove-MpThreat')").replace("'Start-MpWDOScan')", "") `
} | Set-Content -Path $file

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