Textdateiverwaltung: Wie man mit PowerShell liest und bearbeitet

Möchten Sie wissen, wie man PowerShell verwendet, um eine Textdatei zu lesen und Text zu ersetzen? Dies wird als das Lesen von Textdateien in PowerShell bezeichnet.

Suchen Sie nicht weiter! Dieser Blog-Beitrag ist für Sie. Am Ende des Beitrags zeige ich Ihnen eine Funktion, die ich entwickelt habe, um Ihr Leben viel einfacher zu machen.

Das Ersetzen von Text in einer Datei mit PowerShell ist ein dreistufiger Prozess.

  1. Datei lesen
  2. Suchen und Ersetzen des Strings
  3. Änderungen in die Datei schreiben.

Datei lesen

Zuerst müssen Sie die Datei lesen. Erstellen wir zuerst eine Datei mit dem Befehl Set-Content, damit wir eine zum Arbeiten haben.

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

Um diese Datei zu lesen, können Sie den Befehl Get-Content verwenden. Sie können die Datei lesen, indem Sie einen Textdateipfad an den Parameter Path übergeben, wie unten gezeigt.

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

Suchen und Ersetzen des Strings

Jetzt, da wir den Inhalt der Datei im Speicher als Zeichenfolge haben, müssen wir den String suchen und ersetzen. Eine Möglichkeit dies zu tun, ist die Verwendung des Operators -replace. Dieser PowerShell-Operator findet eine Zeichenfolge und ersetzt sie durch eine andere.

Unter Verwendung des Beispielinhalts der Datei können wir den Suchstring foo und den Ersetzungsstring bar angeben, wodurch der Dateiinhalt jetzt foo foo baz wird.

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

In die Datei schreiben

Jetzt, da wir den neuen Dateiinhalt in $newContent gespeichert haben, müssen wir diesen neuen Inhalt jetzt in die Datei schreiben. Eine Möglichkeit dies zu tun ist die Verwendung des Befehls Set-Content.

Der Befehl Set-Content ersetzt den gesamten Inhalt einer Datei durch eine neue Zuweisung.

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

Wenn Sie nun die Datei C:\file.txt mit dem Befehl Get-Content lesen, sehen Sie, dass sie nun den neuen Inhalt enthält.

Umgang mit geöffneten Dateigriffen

Die Schritte, die Sie zuvor durchlaufen haben, funktionieren… meistens. In der realen Welt stellt sich jedoch manchmal heraus, dass es nicht immer so läuft.

Sie werden feststellen, dass Sie gelegentlich mit Dateien umgehen müssen, die entweder von PowerShell selbst geöffnet sind. Dadurch wird verhindert, dass Sie den neuen Inhalt zurück in die Datei schreiben können.

Um diese Situation mit dem geöffneten Dateigriff zu beheben, habe ich einen einfachen Arbeitsablauf erstellt, der es Ihnen ermöglicht, zunächst eine temporäre Textdatei auf der Festplatte mit dem neuen Inhalt zu erstellen, die Originaldatei zu entfernen und dann die temporäre Datei umzubenennen.

Hier ist ein Beispiel, wie es funktioniert:

$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

Unten finden Sie ein Beispiel für eine von mir erstellte Funktion namens Find-InTextFile, die diesen Ansatz in Verbindung mit der Möglichkeit verwendet, Text in einer Datei zu suchen (nicht zu ersetzen).

Diese Funktion verwendet auch die leistungsstärkere Syntax für reguläre Ausdrücke, um Zeichenketten zu suchen. Sie werden feststellen, dass reguläre Ausdrücke Ihnen ermöglichen, flexibler zu suchen, indem Sie Sonderzeichen wie einfache Anführungszeichen, Sonderzeichen und mehr verwenden.

Sie können auch unten sehen, dass ich eine foreach-Schleife verwende, um mehrere Dateien gleichzeitig zu verarbeiten. Dies ist praktisch, wenn Sie eine Reihe von Dateien verarbeiten müssen.

function Find-InTextFile {
    <#
    .SYNOPSIS
        Sucht (oder ersetzt) einen String in einer Textdatei oder in mehreren Dateien.
    .BEISPIEL
        PS> Find-InTextFile -FilePath 'C:\MeineDatei.txt' -Find 'Wasser' -Replace 'Wein'
    
        Ersetzt alle Vorkommen des Strings 'Wasser' durch den String 'Wein' in der Datei 'C:\MeineDatei.txt'.
    .BEISPIEL
        PS> Find-InTextFile -FilePath 'C:\MeineDatei.txt' -Find 'Wasser'
    
        Sucht alle Vorkommen des Strings 'Wasser' in der Datei 'C:\MeineDatei.txt'.
    .PARAMETER FilePath
        Der Dateipfad der Textdatei, auf der Sie eine Suche/Ersetzung durchführen möchten.
    .PARAMETER Find
        Der String, den Sie ersetzen möchten.
    .PARAMETER Replace
        Der String, mit dem Sie Ihren 'Find'-String ersetzen möchten.
    .PARAMETER NewFilePath
        Wenn anstelle des Ersetzens des Inhalts der vorhandenen Datei eine neue Datei mit dem ersetzten String erstellt werden soll, verwenden Sie diesen Parameter, um eine neue Datei zu erstellen.
    .PARAMETER Force
        Wenn der Parameter NewFilePath verwendet wird, überschreibt dieser Parameter jede Datei, die sich in NewFilePath befindet.
    #>
    [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
        }
    }
}

Ressourcen

Für weitere Informationen zum Set-Content-Befehl, schauen Sie sich Set-Content: Der PowerShell-Weg, um in eine Datei zu schreiben oder eine alternative Möglichkeit, Inhalte in eine Datei zu schreiben, den Out-File-Befehl an.

Source:
https://adamtheautomator.com/powershell-read-text-file/