PowerShell Dateiexistenzvalidierung: Umfassender Leitfaden

Verwenden Sie PowerShell, um Dateien zu erstellen, zu lesen, zu aktualisieren und zu löschen? Wenn ja, haben Sie wahrscheinlich Fehler erlebt, wenn die Zieldateien nicht existieren oder bereits vorhanden sind. Glücklicherweise gibt es in PowerShell Möglichkeiten zu überprüfen, ob eine Datei existiert, bevor Sie etwas damit machen.

Zum Beispiel ist es besser, Ihren Code nicht sofort die Datei erstellen zu lassen, sondern zu überprüfen, ob die Datei bereits vorhanden ist. Wie im untenstehenden Screenshot gezeigt, können Sie besseren Code schreiben und klare Ausgaben erzielen.

Creating a file that already exists

In diesem Artikel erfahren Sie verschiedene Möglichkeiten, wie Sie PowerShell verwenden können, um zu überprüfen, ob eine Datei vorhanden ist. Sie lernen auch, wie Sie jeden dieser Wege nutzen können, um besseren Code und Ergebnisse mit Fehlerbehandlungslogik zu erzielen.

Voraussetzungen

Reduzieren Sie Anrufe beim Service Desk und aktualisieren Sie Cache-Anmeldeinformationen für Remote-Benutzer auch außerhalb des VPN mit einer Self-Service-Passwortzurücksetzungslösung. Erhalten Sie eine Demo von Specops uReset!

Dieser Artikel ist ein Anleitung, aus der Sie anhand verschiedener Beispiele lernen werden. Und um den Beispielen zu folgen, benötigen Sie Folgendes:

  • Code-Editor. Die empfohlenen sind Visual Studio Code und Atom, die plattformübergreifend funktionieren. Sie können auch Windows PowerShell ISE verwenden, wenn Sie an einem Windows-Computer arbeiten.
  • Windows PowerShell 5.1 (Desktop) oder PowerShell 7.1 (Core). Die Befehle und Skripts in diesem Artikel gelten für beide PowerShell-Editionen. Egal, ob Sie Windows, Linux oder macOS verwenden, solange Sie PowerShell installiert haben, sind Sie in Ordnung.

Verwandt: So laden Sie PowerShell 7 auf Windows, Linux und macOS herunter und installieren es

Mit PowerShell überprüfen, ob eine Datei vorhanden ist.

In diesem Artikel werden drei Methoden erläutert, wie Sie PowerShell verwenden können, um zu überprüfen, ob eine Datei vorhanden ist. Die Verwendung dieser drei Methoden unterscheidet sich in der Anwendung, aber das Konzept und das Endziel sind dasselbe. Diese drei Möglichkeiten sind:

  • Test-Path-Cmdlet.
  • Get-Item– und Get-ChildItem-Cmdlet.
  • System.IO.File-Klasse.

Es wird Beispiele und Demos für jede dieser drei Methoden geben, einschließlich der Verwendung mit Fehlerbehandlung.

Verwendung von Test-Path

Der erste Weg ist das Test-Path-Cmdlet, das speziell entwickelt wurde, um festzustellen, ob ein Pfad oder eine Datei vorhanden ist. Wenn Sie dieses Cmdlet verwenden, um zu überprüfen, ob eine Datei vorhanden ist, lautet das Ergebnis true oder false. Das Ergebnis gibt an, ob die Datei vorhanden ist oder nicht.

Unten finden Sie die grundlegende Syntax, um das Test-Path-Cmdlet zur Überprüfung einer Datei zu verwenden.

Test-Path -Path <PATH to FILE> -PathType Leaf

Zum Beispiel, wenn Sie überprüfen müssen, ob eine Datei mit dem Namen C:\temp\important_file.txt existiert, verwenden Sie den folgenden Code. Beachten Sie, dass der Teil -PathType Leaf dem Cmdlet mitteilt, explizit nach einer Datei und nicht nach einem Verzeichnis zu suchen.

Test-Path -Path C:\temp\important_file.txt -PathType Leaf

Wenn Sie den obigen Befehl in PowerShell ausführen, gibt das Ergebnis True zurück, wenn die Datei existiert. Andernfalls wäre das Ergebnis False, wie im Screenshot unten zu sehen ist.

Using Test-Path in PowerShell to check if a file exists

Verwandt: So verwenden Sie das PowerShell Test-Path Cmdlet

Beispiel: Erstellen einer Datei, wenn die Datei nicht vorhanden ist

Dieses Beispiel ist ein typischer Anwendungsfall zum Erstellen von Dateien an einem bestimmten Speicherort. Um den Fehler „Datei existiert bereits“ zu vermeiden, überprüft das Skript, ob die Datei bereits vorhanden ist, bevor es versucht, sie zu erstellen. Wenn die Datei existiert, zeigt das Skript eine Meldung an und versucht nicht, die Datei erneut zu erstellen.

Kopieren Sie den folgenden Code und speichern Sie ihn in einer Datei namens Create-NewFile.ps1. Ändern Sie den Wert der Variablen $path, falls Sie den Ausgabespeicherort der Datei ändern möchten. Speichern Sie das Skript und führen Sie es in PowerShell aus, um es zu testen.

# Create-NewFile.ps1

# Vollständiger Pfad der Datei
$file = 'c:\temp\important_file.txt'

# Wenn die Datei nicht existiert, erstellen Sie sie.
if (-not(Test-Path -Path $file -PathType Leaf)) {
     try {
         $null = New-Item -ItemType File -Path $file -Force -ErrorAction Stop
         Write-Host "The file [$file] has been created."
     }
     catch {
         throw $_.Exception.Message
     }
 }
# Wenn die Datei bereits existiert, zeigen Sie die Meldung an und tun nichts.
 else {
     Write-Host "Cannot create [$file] because a file with that name already exists."
 }

Der Screenshot unten zeigt die beiden verschiedenen Ausgaben. Die erste ist, wenn das Skript ausgeführt wird, während die Datei nicht existiert. Die zweite ist nach dem Erstellen der Datei, wenn sie bereits existiert.

Running the PowerShell script to create a file

Verwandte: Zurück zu den Grundlagen: Wie man ein PowerShell-Skript ausführt

Verwendung von Get-Item und Get-ChildItem

Der Zweck des Cmdlets „Get-Item“ besteht darin, das Element an einem angegebenen Speicherort abzurufen. Im Vergleich dazu dient das Cmdlet „Get-ChildItem“ dazu, die Elemente und Unterlemente an einem oder mehreren angegebenen Speicherorten abzurufen. Die Funktionalität dieser beiden Cmdlets besteht nicht explizit darin, zu überprüfen, ob Dateien existieren.

Was passiert, wenn Sie „Get-Item“ oder „Get-ChildItem“ verwenden, um ein Element abzurufen, das nicht existiert? Sie erhalten einen Fehler für jede fehlende Datei. Nehmen Sie die folgenden Befehle als Beispiel.

$file = 'c:\temp\important_file.txt'
Get-Item -Path $file
Get-ChildItem -Path $file

Angenommen, die Datei „c:\temp\important_file.txt“ existiert nicht. Jeder der obigen Befehle gibt einen Fehler zurück. Wie Sie aus dem folgenden Beispiel sehen können, ist die Fehlermeldung für beide Befehle dieselbe.

Using Get-Item and Get-ChildItem in PowerShell to check if a file exists

Beispiel: Archivieren der vorhandenen Datei und Erstellen einer neuen Datei

In diesem Beispiel verwendet das Skript die Cmdlets „Get-Item“ und „Test-Path“. Die Logik dieses Skripts besteht darin, folgende Aktionen durchzuführen:

  • Testen Sie, ob der Archivordner mit Test-Path existiert.
    • Wenn der Archivordner nicht existiert, erstellt das Skript einen neuen Archivordner in diesem Format – jjjj-MMM-tt_hh-mm-ss.
    • Dann verschiebt das Skript die alte Datei in den Archivordner.
  • Überprüfen Sie, ob die Datei bereits existiert, mit Get-Item.
    • Wenn die Datei existiert, verschiebt das Skript sie zuerst in den Archivordner. Dann erstellt das Skript die neue Datei am ursprünglichen Speicherort.
    • Wenn die Datei nicht existiert, erstellt das Skript die neue Datei.

Kopieren Sie den folgenden Code und speichern Sie ihn als Create-NewFileAfterArchive.ps1. Nachdem Sie das Skript gespeichert haben, führen Sie es in PowerShell aus und überprüfen Sie die Ergebnisse.

# Create-NewFileAfterArchive.ps1

# Vollständiger Pfad der Datei
$file = 'c:\temp\important_file.txt'

# Vollständiger Pfad zum Archivordner
$archiveFolder = "c:\temp\archive_$(get-date -Format 'yyyy-MMM-dd_hh-mm-ss-tt')\"

# Wenn die Datei existiert, verschieben Sie sie in den Archivordner und erstellen Sie dann eine neue Datei.
if (Get-Item -Path $file -ErrorAction Ignore) {
    try {
        ## Wenn der Archivordner nicht existiert, erstellen Sie ihn jetzt.
        if (-not(Test-Path -Path $archiveFolder -PathType Container)) {
            $null = New-Item -ItemType Directory -Path $archiveFolder -ErrorAction STOP
        }
        ## Verschieben Sie die vorhandene Datei in das Archiv.
        Move-Item -Path $file -Destination $archiveFolder -Force -ErrorAction STOP
        Write-Host "The old file [$file] has been archived to [$archiveFolder]"
     } catch {
        throw $_.Exception.Message
     }
 }
 Create the new file
 try {
     $null = New-Item -ItemType File -Path $file -Force -ErrorAction Stop
     Write-Host "The new file [$file] has been created."
 } catch {
    Write-Host $_.Exception.Message
 }

Hinweis: Der Parameter -ErrorAction Ignore unterdrückt den Fehler (wird nicht in der Konsole angezeigt) und zeichnet den Fehler auch nicht in der automatischen Variable $error auf.

In der untenstehenden Abbildung hat der erste Skriptlauf die Datei c:\temp\important_file.txt erstellt. Die folgenden Skriptausführungen haben jedes Mal einen neuen Archivordner erstellt, die vorhandene Datei in den Archivordner verschoben und dann eine neue Datei in c:\temp\important_file.txt erstellt.

Running a script in PowerShell to check if a file exists using Get-Item

Verwendung der [System.IO.File]::Exists() .NET-Methode

Die letzte Methode, die Sie in diesem Artikel lernen werden, ist die System.IO.File .NET-Klasse, insbesondere die Exists()-Methode. Eine der Stärken von PowerShell ist die Möglichkeit, .NET-Klassen und -Methoden zu importieren und zu verwenden.

Zum Beispiel, um die Exists()-Methode in PowerShell zu verwenden, um zu überprüfen, ob eine Datei existiert, verwenden Sie den folgenden Code.

[System.IO.File]::Exists("PATH")

Die obige Methode liefert ein boolesches Ergebnis – true oder false. Wenn das Ergebnis true zurückgibt, bedeutet dies, dass die Zieldatei existiert. Andernfalls wird das Ergebnis false zurückgegeben, wenn die Zieldatei nicht existiert.

Im folgenden Beispielcode wird überprüft, ob die Datei c:\temp\important_file.txt existiert.

$file = 'c:\temp\important_file.txt'
[System.IO.File]::Exists($file)

Wie Sie aus dem unten stehenden Ergebnis sehen können, liefert das Ergebnis true und bestätigt somit, dass die Datei existiert.

Using System.IO.File class in PowerShell

Mit dieser .NET-Methode können Sie auch sogenannte ternäre Operationen verwenden, wie im folgenden Beispiel. Anstatt die standardmäßigen true- oder false-Ergebnisse anzuzeigen, können Sie das Ergebnis mit einer kürzeren Implementierung anpassen. Beachten Sie jedoch, dass der ternäre Operator in diesem Beispiel nur für PowerShell 7+ gilt.

$file = 'c:\temp\important_file.txt'
[System.IO.File]::Exists($file) ? "The file exists." : "The file does not exist."

Beispiel: Aktualisierung des Dateiinhalts, falls die Datei existiert

In diesem Beispielskript wird der Textdatei ein neuer GUID-Wert angehängt. Die Aktualisierung des Inhalts erfolgt jedoch nur, wenn die Datei existiert. Andernfalls wird eine Meldung angezeigt und nichts weiter ausgeführt.

Kopieren Sie das folgende Skript und speichern Sie es als Update-FileContents.ps1. Ändern Sie bei Bedarf den Dateipfadwert der Variable $file. Führen Sie dann das Skript in PowerShell aus, um es zu testen.

# Update-FileContents.ps1

#Vollständiger Pfad der Datei
$file = 'c:\temp\important_file.txt'

# Wenn die Datei vorhanden ist, fügen Sie einen neuen GUID-Wert in die Datei ein.
if ([System.IO.File]::Exists($file)) {
    try {
        $newValue = ((New-Guid).Guid)
        Add-Content -Path $file -Value $newValue -ErrorAction STOP
        Write-Host "The file [$file] has been updated with [$newValue]"
     } catch {
        throw $_.Exception.Message
     }    
 }

# Wenn die Datei nicht vorhanden ist, zeigen Sie eine Meldung an und tun Sie nichts.
 else {
     Write-Host "The file [$file] could not be updated because it does not exist."
 }

Sie können im folgenden Screenshot sehen, dass das Skript die Datei bei jedem Durchlauf aktualisiert hat. Das Update erfolgte, weil die Methode [System.IO.File]::Exists() bestätigt hat, dass die Datei c:\temp\important_file.txt vorhanden ist.

Am Ende bestätigt das Ausführen des Befehls gc c:\temp\important_file.txt zum Lesen des Dateiinhalts, dass das Skript die Datei mit den GUID-Werten aktualisiert hat.

Using [System.IO.File]::Exists() .NET Method in PowerShell

Verwandt: Verwendung von PowerShell-Datentypbeschleunigern zur Beschleunigung des Codierens

Zusammenfassung

Reduzieren Sie Anrufe beim Service Desk und aktualisieren Sie Cache-Anmeldeinformationen für Remote-Benutzer, auch außerhalb des VPN, mit einer Self-Service-Passwortzurücksetzungslösung. Erhalten Sie eine Demo von Specops uReset!

In diesem Artikel haben Sie gelernt, dass es mehr als eine Möglichkeit gibt, PowerShell zu verwenden, um zu überprüfen, ob eine Datei vorhanden ist. Es ist eine gute Praxis, das Vorhandensein einer Datei zu überprüfen, bevor Änderungen an der Datei vorgenommen werden.

Du hast gelernt, wie man die Cmdlets Get-Item, Get-ChildItem und Test-Path verwendet. Sowie die Methode [System.IO.File]::Exists() .NET. Die Beispiele haben dir gezeigt, wie man Techniken anwendet und sie mit Fehlerbehandlungslogik kombiniert.

Hör auf, diese Fehlermeldungen zu ertragen. Überwinde sie, indem du Code hinzufügst, um zu überprüfen, ob eine Datei existiert, bevor irgendwelche dateibezogenen Operationen durchgeführt werden. Die hier gelernten Techniken decken nur die Grundlagen ab, und es liegt nun an dir, sie zu verbessern.

Source:
https://adamtheautomator.com/powershell-check-if-file-exists/