当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用PowerShell读取文本文件并替换文本

作者:精品下载站 日期:2024-12-14 12:39:33 浏览:15 分类:玩电脑

使用PowerShell读取文本文件并替换文本


需要知道如何使用 PowerShell 读取文本文件并替换文本?这就是我们所说的 PowerShell 读取文本文件。

别再犹豫了!这篇博文适合您。在文章的最后,我将向您展示我构建的一个功能,让您的生活变得更加轻松。

使用 PowerShell 替换文件中的文本分为三个步骤。

  1. 读取文件
  2. 查找并替换字符串
  3. 将更改写入文件。

读取文件

您首先需要读取该文件。我们首先使用 Set-Content cmdlet 创建一个,以便我们可以使用它。

Set-Content -Path 'C:\file.txt' -Value 'foo bar baz'

要读取此文件,您可以使用Get-Content命令。您可以通过向 Path 参数提供文本文件路径来读取该文件,如下所示。

$content = Get-Content -Path 'C:\file.txt'

查找并替换字符串

现在我们已经将文件的内容存储在内存中的字符串中,我们需要搜索并替换该字符串。一种方法是使用 -replace 运算符。此 PowerShell 运算符查找一个字符串并将其替换为另一个字符串。

使用示例文件内容,我们可以为搜索字符串 foo 提供替换字符串 bar,这应该使文件内容现在为 foo foo baz

PS> $newContent = $content -replace 'foo', 'bar'
bar bar baz

写入文件

现在我们已将新文件内容保存在 $newContent 中,现在我们需要将此新内容写回到文件中。一种方法是使用 Set-Content 命令。

Set-Content 命令通过分配新值来替换文件的所有内容。

$newContent | Set-Content -Path 'C:\file.txt'

现在,每当您使用 Get-Content 读取 C:\file.txt 文件时,您都会看到它现在包含新内容。

处理打开的文件句柄

您之前执行的步骤在大多数情况下都是有效的。然而,你会发现在现实世界中,事情并不总是这样。

您会发现有时需要处理打开 PowerShell 本身的文件。这会阻止您将新内容写回到文件中。

为了解决这种打开文件句柄的情况,我创建了一个简单的工作流程,允许您首先使用新内容在磁盘上创建一个临时文本文件,删除原始文件,然后重命名临时文件。

以下是其工作原理的示例:

$filePath = 'C:\file.txt'
$tempFilePath = "$env:TEMP$($filePath | Split-Path -Leaf)"
$find = 'foo'
$replace = 'bar'

(Get-Content -Path $filePath) -replace $find, $replace | Add-Content -Path $tempFilePath

Remove-Item -Path $filePath
Move-Item -Path $tempFilePath -Destination $filePath

下面是我构建的名为 Find-InTextFile 的函数示例,该函数使用此方法并结合了在文件中查找(而不是替换)文本的功能。

该函数还使用更强大的正则表达式语法来查找字符串。您会发现正则表达式允许您使用单引号、特殊字符等特殊字符进行更灵活的搜索。

您还可以在下面看到我使用 foreach 循环一次处理多个文件。如果您有大量文件需要处理,这会派上用场。

function Find-InTextFile {
    <#
    .SYNOPSIS
        Performs a find (or replace) on a string in a text file or files.
    .EXAMPLE
        PS> Find-InTextFile -FilePath 'C:\MyFile.txt' -Find 'water' -Replace 'wine'
    
        Replaces all instances of the string 'water' into the string 'wine' in
        'C:\MyFile.txt'.
    .EXAMPLE
        PS> Find-InTextFile -FilePath 'C:\MyFile.txt' -Find 'water'
    
        Finds all instances of the string 'water' in the file 'C:\MyFile.txt'.
    .PARAMETER FilePath
        The file path of the text file you'd like to perform a find/replace on.
    .PARAMETER Find
        The string you'd like to replace.
    .PARAMETER Replace
        The string you'd like to replace your 'Find' string with.
    .PARAMETER NewFilePath
        If a new file with the replaced the string needs to be created instead of replacing
        the contents of the existing file use this param to create a new file.
    .PARAMETER Force
        If the NewFilePath param is used using this param will overwrite any file that
        exists in NewFilePath.
    #>
    [CmdletBinding(DefaultParameterSetName = 'NewFile')]
    [OutputType()]
    param (
        [Parameter(Mandatory = $true)]
        [ValidateScript({Test-Path -Path $_ -PathType 'Leaf'})]
        [string[]]$FilePath,
        [Parameter(Mandatory = $true)]
        [string]$Find,
        [Parameter()]
        [string]$Replace,
        [Parameter(ParameterSetName = 'NewFile')]
        [ValidateScript({ Test-Path -Path ($_ | Split-Path -Parent) -PathType 'Container' })]
        [string]$NewFilePath,
        [Parameter(ParameterSetName = 'NewFile')]
        [switch]$Force
    )
    begin {
        $Find = [regex]::Escape($Find)
    }
    process {
        try {
            foreach ($File in $FilePath) {
                if ($Replace) {
                    if ($NewFilePath) {
                        if ((Test-Path -Path $NewFilePath -PathType 'Leaf') -and $Force.IsPresent) {
                            Remove-Item -Path $NewFilePath -Force
                            (Get-Content $File) -replace $Find, $Replace | Add-Content -Path $NewFilePath -Force
                        } elseif ((Test-Path -Path $NewFilePath -PathType 'Leaf') -and !$Force.IsPresent) {
                            Write-Warning "The file at '$NewFilePath' already exists and the -Force param was not used"
                        } else {
                            (Get-Content $File) -replace $Find, $Replace | Add-Content -Path $NewFilePath -Force
                        }
                    } else {
                        (Get-Content $File) -replace $Find, $Replace | Add-Content -Path "$File.tmp" -Force
                        Remove-Item -Path $File
                        Move-Item -Path "$File.tmp" -Destination $File
                    }
                } else {
                    Select-String -Path $File -Pattern $Find
                }
            }
        } catch {
            Write-Error $_.Exception.Message
        }
    }
}

资源

有关 Set-Content 命令的更多信息,请查看Set-Content:写入文件的 PowerShell 方式 或将内容写入文件的替代方式,输出文件命令。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯