In diesem kleinen Artikel beschreibe ich, wie man das Cmdlet Test-Path verwendet, um zu prüfen, ob eine Datei existiert – sowie eine .NET-Alternative, die ein Kollege einmal in einem SCOM-Kontext verwenden musste. Geben Sie Get-Help Test-Path für weitere Informationen ein, eventuell mit dem Schalter „-online“. Ich demonstriere auch kurz die .NET-Klassenmethode Exists() aus der Klasse System.IO.File.
Ich zeige auch, wie man eine neue Datei anlegt, wenn noch keine existiert, und wie man Fehler beim Anlegen der Datei anständig behandelt.
Die offizielle Microsoft-Online-Dokumentation finden Sie hier unter diesem Link.
Tweet
How To Check If A File Exists With PowerShell
So etwas können Sie zur Überprüfung in der Kommandozeile verwenden:
PS C:\> Test-Path C:\WindowsTrue
Beachten Sie, dass Sie Anführungszeichen benötigen, wenn der Pfad Leerzeichen, Klammern – und möglicherweise andere Zeichen enthält, die mir jetzt nicht einfallen. PowerShell fügt automatisch Anführungszeichen hinzu, wenn Sie mit Tabulator abschließen. Ich empfehle, einfache Anführungszeichen zu verwenden, da doppelte Anführungszeichen Variablen „erweitern“ (meist relevant, wenn Sie „$“ im Pfad haben).
PS C:\> Test-Path -Path 'C:\Program Files'True
Ansonsten sehen Sie so etwas:
PS C:\> Test-Path C:\Program FilesTest-Path : A positional parameter cannot be found that accepts argument 'Files'.
Um explizit sicherzustellen, dass es sich um eine Datei und nicht um ein Verzeichnis handelt, verwenden Sie den Parameter -PathType, der die folgenden möglichen Werte hat:
- Beliebig
- Blatt (Datei)
- Container (Verzeichnis/Ordner)
Beispiel
Skriptverwendung
In einem Skript würden Sie es typischerweise in einer if-Anweisung verwenden. Um zu negieren und zu prüfen, ob der Ordner oder die Datei nicht existiert, verwenden Sie entweder „!“ oder „-not“, und denken Sie daran, die Test-Pfad-Anweisung in Klammern einzuschließen.
Denken Sie auch daran, dass Sie den gesamten Pfad in Anführungszeichen einschließen müssen, wenn der Pfad- oder Dateiname ein Leerzeichen enthält. Einfache Anführungszeichen oder doppelte Anführungszeichen funktionieren genauso, wenn es keine „erweiterbaren“ Teile im Pfad oder Dateinamen gibt, aber die etwas sicherere Wahl sind einfache Anführungszeichen. Dies ist die Standardeinstellung von PowerShell, wenn Sie Namen mit Tabulator an der Eingabeaufforderung automatisch vervollständigen.
Sie sollten sich auch des Unterschieds zwischen -Path und -LiteralPath bewusst sein. Letzteres nimmt den Pfad, wie der Name schon sagt, wörtlich, während ersteres eine Wildcard-Syntax unterstützt. Dies wird oft zufällig entdeckt, wenn jemand auf eine Datei mit ungeraden Klammern darin stößt, weil es Teil der gleichen Syntax ist, die -Path verwendet, wie bei einer Hex-Ziffer. Dies führt, zumindest in früheren Versionen von PowerShell, zu Fehlermeldungen, wenn -Path verwendet wird. Wenn Sie Verzeichnisstrukturen von einem Stammverzeichnis aus auflisten, verwenden Sie -LiteralPath. Solange Sie keine Wildcard-Unterstützung benötigen, ist dies die sicherere Wahl.
Erstellen einer Datei, wenn sie nicht existiert
Mit dem Cmdlet Set-Content können Sie eine neue Datei erstellen, wenn sie derzeit nicht existiert.
Sieh dir meine Beispiele und die Get-Help Set-Content an oder die Microsoft Docs online unter diesem Link.
Sie können auch Out-File und andere Methoden verwenden, auf die ich hier nicht näher eingehen werde.
Natürlich können Sie hier auch eine $Variable mit dem Dateinamen anstelle des hartcodierten Textes verwenden.
Das erzeugt einfach eine Datei mit einer leeren Zeichenkette als Inhalt.
Oder Sie können es so machen, wenn Sie auf der Kommandozeile arbeiten oder wenn es Ihnen gefällt:
"" | Set-Content x:\path\filenamehere.xml
Ich dachte mir, dass es gut ist, zuerst zu demonstrieren, was wahrscheinlich als die korrekteste Art der Skriptnutzung angesehen wird.
Wenn Sie testen wollen, ob das Erstellen der Datei fehlschlägt, können Sie eine try {} catch {}-Anweisung zusammen mit dem Parameter und Wert „-ErrorAction Stop“ an das Cmdlet zum Erstellen der Datei übergeben, z.z. B. Set-Content oder Out-File.
Hier ein kurzes Beispiel:
Sehen ist oft glauben (manchmal zu Unrecht, aber das ist eine andere Geschichte), daher hier ein Bildschirmauszug von PowerShell ISE, der dieses Beispiel in einer .ps1-Skriptdatei ausführt.
Aufzählung möglicher PathType-Werte
Ein kleiner „Trick“, um die möglichen Aufzählungswerte für -PathType zu sehen, ist, einen zu verwenden, der nicht existiert, etwa so:
Und wir beachten den Teil, in dem es heißt:
The possible enumeration values are "Any, Container, Leaf".
Using The .NET System.IO.File-Klasse Methode „Exists“
Sie können auch die Exists()-Methode der .NET System.IO.File-Klasse verwenden:
PS E:\temp> ::Exists('E:\temp\csv1.csv')True
In der PowerShell ist der „System“-Namensraum optional, Sie können also auch einfach „Io.File“ verwenden.
Eine Sache, die Sie beachten sollten, ist, dass Sie bei dieser Methode einen vollständigen Pfad benötigen. Um mit der Methode IO.File Exists() zu prüfen, ob sich eine Datei im aktuellen Verzeichnis befindet, können Sie etwa so vorgehen, wobei Sie typischerweise eine Variable mit dem Dateinamen anstelle des hier hart codierten „test.ps1“ verwenden würden: