如何使用 PowerShell 替换文件中的文本

PowerShell 是一个强大的文件和文件夹管理工具。它允许您在系统上创建、复制、删除、移动、重命名和查看文件和文件夹。
本教程将介绍在文件中用 PowerShell 替换每个字符串出现的不同方法。
使用 Get-Content
和 Set-Content
在文件中替换每个字符串出现
'Get-Content'
命令检索提供路径中项目的内容,例如文件中的文本。'Set-Content'
cmdlet 是一个字符串处理工具,允许您向文件添加新内容或替换现有内容。
您可以使用 Get-Content
和 Set-Content
cmdlet 替换文件中每个字符串的出现。
语法:
(Get-Content -Path 'Path\to\Your\File.txt') -Replace 'OldString', 'NewString' | Set-Content -Path 'Path\to\Your\File.txt'
在语法中,我们将 'OldString'
替换为我们要替换的字符串,将 'NewString'
替换为我们要放入其位置的字符串。确保将 'Path\to\Your\File.txt'
替换为实际的文件路径。
我们来举个例子。我们在目录(C:\New
)中有一个文本文件(test.txt
),内容如下。
Get-Content C:\New\test.txt
输出:
Welcome to Linux tutorials.
Linux is free.
Linux is powerful.
现在,让我们使用 -Replace
参数将文本文件 test.txt
中每个字符串 'Linux'
替换为 'PowerShell'
。在 Get-Content
周围需要括号 ()
。
(Get-Content C:\New\test.txt) -Replace 'Linux', 'PowerShell' | Set-Content C:\New\test.txt
然后,查看 test.txt
文件的内容以验证更改。
Get-Content C:\New\test.txt
如您所见,Linux
已成功替换为 PowerShell
。
输出:
Welcome to PowerShell tutorials.
PowerShell is free.
PowerShell is powerful.
此方法使用字符串数组在文件中查找和替换字符串,因为 Get-Content
cmdlet 返回一个数组。如果 Get-Content
返回一个单一字符串,替换字符串会更容易。
我们可以使用 -Raw
参数,如下所示。-Raw
参数用于确保 'C:\New\test.txt'
的内容作为一个单一字符串读取,从而在整个文件中有效替换 'Linux'
为 'PowerShell'
。
(Get-Content C:\New\test.txt -Raw) -Replace 'Linux', 'PowerShell' | Set-Content C:\New\test.txt
在此代码中,我们将位于 'C:\New\test.txt'
的文件内容作为一个单一字符串读取。然后,我们使用 -Replace
操作符在该字符串中查找并替换所有 'Linux'
的出现为 'PowerShell'
。
最后,我们将修改的内容保存回同一文件,有效地用新文本更新它。此代码是使用 PowerShell 在文件中执行文本替换的简单方法。
使用 File
类在文件中替换每个字符串出现
File
类提供了常见操作的静态方法,例如创建、复制、移动、打开、删除和追加到单个文件。使用 File
类的 Replace()
方法可以替换指定文件的内容。
语法:
$string = [System.IO.File]::ReadAllText("FilePath")
$string = $string.Replace("OldString", "NewString")
[System.IO.File]::WriteAllText("FilePath", $string)
参数:
"FilePath"
:应替换为实际文件路径。"OldString"
:这是您希望替换的字符串。"NewString"
:这是您希望用来替换它的字符串。
ReadAllText()
方法打开一个文本文件,读取该文件中的所有文本,然后关闭文件。
WriteAllText()
方法创建一个新文件,将特定字符串写入文件,并关闭文件。如果目标文件在位置上已存在,则将其覆盖。
我们来举个例子。我们在目录(C:\New
)中有一个文本文件(python.txt
),内容如下。
Get-Content C:\New\python.txt
输出:
Find the best Python tutorials and learn Python easily from DelftStack.
现在,让我们使用 File
类方法在文件中替换每个字符串的出现。
$string = [System.IO.File]::ReadAllText("C:\New\python.txt").Replace("Python", "JavaScript")
[System.IO.File]::WriteAllText("C:\New\python.txt", $string)
在上面的代码中,我们首先创建一个名为 $string
的变量,用于存储在执行文本替换后 'C:\New\python.txt'
文件的修改内容。使用 [System.IO.File]::ReadAllText("C:\New\python.txt")
,我们读取整个文件的内容并将其保存到 $string
。
在下一步中,我们使用 Replace()
方法定位内容中所有 "Python"
的实例,并将其替换为 "JavaScript"
,有效地更新文本。最后,我们使用 [System.IO.File]::WriteAllText("C:\New\python.txt", $string)
将修改的内容写回同一文件,覆盖原始文本并保留我们的更改。
验证在 C:\New\python.txt
中所做的更改。
Get-Content C:\New\python.txt
输出:
Find the best JavaScript tutorials and learn JavaScript easily from DelftStack.
在输出中,我们可以看到 "Python"
被替换为 "JavaScript"
。
在多个文件中替换每个字符串出现
上述方法替换单个文件中的字符串。有时,您可能需要在多个文件中替换相同的字符串。
在这种情况下,您可以使用以下命令在多个文件中替换每个指定字符串的出现。
Get-ChildItem 'C:\New\*.txt' | foreach {
(Get-Content $_) | foreach { $_ -Replace 'weekly', 'monthly' } | Set-Content $_
}
在上面的代码中,我们首先使用 Get-ChildItem
收集 'C:\New'
目录中 '.txt'
文件的列表。星号 *
通配符指定所有扩展名为 .txt
的文件。
然后,我们循环遍历每个文件,使用 Get-Content
读取其内容,并应用替换操作,将 'weekly'
更改为 'monthly'
,使用 -Replace
操作符。然后将修改后的内容使用 Set-Content
写回同一文件。
此过程在目录中的每个文件上重复,有效地将 'weekly'
替换为 'monthly'
。
我们还可以使用 -Recurse
参数在指定目录及其子目录中的文件中替换字符串。
Get-ChildItem 'C:\New\*.txt' -Recurse | foreach {
(Get-Content $_) | foreach { $_ -Replace 'weekly', 'monthly' } | Set-Content $_
}
在此代码中,我们首先使用 Get-ChildItem
构建 '.txt'
文件的列表,位于 'C:\New'
及其子目录中。-Recurse
选项确保我们不仅在指定目录中搜索这些文件,还在其子目录中搜索。
然后,我们使用一对 ForEach
循环访问每个文件的内容。在内层循环中,我们使用 -Replace
操作符将文本中的 'weekly'
替换为 'monthly'
。
最后,我们将调整后的内容保存回同一文件。此过程遍历 'C:\New'
及其子文件夹中的所有文件,使我们能够有效地将 'weekly'
替换为多个文件和嵌套目录中的 'monthly'
。
结论
在本文中,我们查看了使用 Get-Content
和 Set-Content
cmdlet 在单个文件中替换字符串的不同方法,提供了基本和更有效的 -Raw
参数方法。随后,我们利用 File
类的强大功能在文件中替换文本,展示了更高级的技术。
此外,我们通过在目录及其子目录中的多个文件中替换文本扩展了我们的知识。这些方法使人们轻松编辑文件中的文本,并展示了 PowerShell 在此类任务中的实用性。