PowerShell Test-Path Cmdlet: Dateien, Schlüssel und mehr überprüfen

Wenn Sie einen Pfad zu einer Datei, einem Registrierungsschlüssel, einem Zertifikat oder einem anderen PowerShell-Laufwerk-Pfad validieren müssen, benötigen Sie das Test-Path-Cmdlet.

Das Test-Path-Cmdlet ist eine einfache, aber nützliche Möglichkeit, schnell viele Attribute einer Datei und anderer Elemente zu überprüfen. Es kann überprüfen, ob eine Datei existiert (oder andere Elementtypen), ob eine Zeichenfolge im richtigen Pfadformat vorliegt oder ob ein Element neuer oder älter als eine bestimmte Zeit ist.

In diesem Tutorial erfahren Sie alles über das PowerShell-Test-Path-Cmdlet und wie Sie es verwenden können, um Ihre PowerShell-Skripte zu verbessern.

Voraussetzungen

Wenn Sie die Beispiele in diesem Tutorial ausprobieren möchten, benötigen Sie eine Sache: PowerShell. Genauer gesagt wird das Tutorial PowerShell v7.03 unter Windows 10 verwenden, obwohl viele der Techniken, die Sie lernen werden, auch auf ältere Versionen anwendbar sind.

Was macht das Test-Path-Cmdlet?

Das PowerShell-Test-Path-Cmdlet ist eine der einfachsten Befehle überhaupt. Es ist ein Befehl, der seit Beginn von PowerShell vorhanden ist und nur zwei Werte zurückgibt: True oder False.

Aber lassen Sie sich von der Einfachheit nicht täuschen; es wird Ihnen so viel Zeit sparen, wenn Sie Informationen in Ihren PowerShell-Skripten validieren.

Denken Sie an das PowerShell-Test-Path-Cmdlet als Qualitätskontrolle beim Arbeiten mit PowerShell-Providern und Laufwerken. Wenn Sie ein Skript schreiben, arbeiten Sie häufig mit verschiedenen Elementen in PowerShell-Laufwerken. PowerShell-Laufwerke wie C:\, HKLM, Cert und so weiter.

Test-Path funktioniert nicht mit allen PS-Laufwerken. Wenn Sie beispielsweise versuchen, Test-Path gegen einen Registrierungsschlüssel zu verwenden, funktioniert es. Wenn Sie versuchen, Test-Path gegen einen Registrierungswert zu verwenden, gibt es jedes Mal Falsch zurück.

Wenn Sie neugierig sind, führen Sie das Get-PSDrive-Cmdlet jetzt in PowerShell aus und bemerken Sie alle PS-Laufwerke, die für Sie angezeigt werden.

PS Drives after running Get-PSDrive

All diese Laufwerke haben Pfade in ihnen wie C:\Windows, HKLM:\Software usw. Wenn Sie mit Pfaden in Ihren PowerShell-Skripten arbeiten, ist es immer ratsam, zuerst zu überprüfen, ob der Pfad gültig oder vorhanden ist. Das ist es, was das Test-Path von PowerShell macht.

Test-Path definiert eine Bedingung, die True oder False zurückgibt, abhängig davon, ob eine bestimmte Bedingung erfüllt ist (typischerweise ob eine Datei/Ordner, ein Registrierungsschlüssel, Zertifikat oder sogar eine Variable existiert oder nicht).

Test-Path-Parameter und Verwendung

Wie viele andere PowerShell-Cmdlets verfügt das Test-Path-Cmdlet über verschiedene Parameter, die sein Verhalten ändern. Lassen Sie uns nun jeden Parameter durchgehen und zeigen, wie er funktioniert und welche Art von Ergebnissen Sie erwarten können.

Path

Der Path-Parameter ist ein obligatorischer Parameter, den Sie bei jeder Ausführung von Test-Path verwenden. Der Path-Parameter definiert den Pfad des PSDrive, den Sie auf Existenz überprüfen möchten.

Wenn Sie beispielsweise überprüfen möchten, ob der Ordner C:\Foo existiert, geben Sie den entsprechenden Pfad an den Path-Parameter an. Je nachdem, ob C:\Foo tatsächlich existiert oder nicht, würde Test-Path entweder True oder False zurückgeben.

PS> Test-Path -Path 'C:\Foo'
True

Dieselbe Technik kann auch für jeden Elementpfad verwendet werden. Vielleicht möchten Sie überprüfen, ob der Registrierungsschlüssel HKLM:\Software\Foo existiert. Verwenden Sie einfach den Registrierungsschlüsselpfad mit dem Path-Parameter.

PS> Test-Path -Path 'HKLM:\Software\Foo'
True

Beachten Sie, dass alle im Laufe dieses Tutorials vorgeführten Techniken mit jedem PowerShell-Laufwerkspfad funktionieren werden.

Verwendung von Platzhaltern

Was passiert, wenn es Ihnen nicht unbedingt wichtig ist, ob ein Pfad einen bestimmten Wert hat? Stattdessen möchten Sie nur überprüfen, ob ein Pfad einem bestimmten Muster entspricht. In diesem Fall können Sie Platzhalter im Wert des Path verwenden.

Vielleicht möchten Sie überprüfen, ob Ihr Ordner C:\Foo einen Unterordner enthält, der mit Bar beginnt. In diesem Fall könnten Sie einen Platzhalter verwenden.

PS> Test-Path -Path 'C:\Foo\Bar*'

Sobald Sie den obigen Befehl ausführen, wird Test-Path überprüfen, ob ein Ordner existiert, der mit irgendeinem Ordner beginnt, der mit Bar beginnt, und True oder False zurückgeben, je nachdem, ob ein Ordner existiert, der diesen Kriterien entspricht oder nicht.

Sterne (*) passen zu einem oder mehreren Zeichen, aber Sie können auch Fragezeichen (?) verwenden, um genauer zu sein und nach einem einzelnen Zeichen zu suchen.

Im obigen Szenario als Beispiel, wenn der Ordner C:\Foo\Bar1 existiert, könnten Sie nach einem beliebigen Unterordner von Foo suchen, der mit Bar beginnt und genau vier Zeichen lang ist, mit dem folgenden Befehl.

PS> Test-Path -Path 'C:\Foo\Bar?'

Wenn Sie aus irgendeinem Grund den Path-Parameter mit Platzhaltern verwenden möchten, aber ein Platzhalterzeichen wie * wörtlich übereinstimmen möchten, können Sie die Platzhalterzeichen jederzeit mit einem Backtick (`) escapen.

LiteralPath

Der Parameter LiteralPath ist nahezu identisch mit dem Parameter Path mit einer Ausnahme; er erlaubt keine Platzhalter. Wenn Sie LiteralPath verwenden, wird der Pfadwert wörtlich interpretiert.

Wenn Sie beispielsweise versuchen, ein Asterisk oder ein Fragezeichen innerhalb des Pfadwerts mit LiteralPath zu verwenden, wird Test-Path die Platzhalterzeichen komplett ignorieren und wörtlich für C:\Foo\Bar? testen, wie im folgenden Beispiel.

PS> Test-Path -LiteralPath 'C:\Foo\Bar?'

Sie sollten LiteralPath als standardmäßigen Pfadparameter verwenden, wenn Sie keine Platzhalterzeichen verwenden müssen, um sicherzustellen, dass Test-Path den erwarteten Pfad testet.

PathType

Standardmäßig gibt Test-Path, wenn Sie ihm einen Pfad angeben, True zurück, wenn es etwas in diesem Pfad findet. Der Eintrag mit einem Pfad könnte ein Container wie ein Dateiordner, ein Registrierungsschlüssel, Zertifikatsspeicher usw. oder ein Blatt wie eine Datei, Registrierungswert oder Zertifikat sein.

Sie können Test-Path dazu zwingen, granularer zu werden und speziell für einen Container- oder Blattelementtyp zu testen, indem Sie den PathType-Parameter verwenden.

Test-Path verwendet standardmäßig den PathType-Wert Any.

Wenn zum Beispiel ein Ordner unter C:\Foo\Bar existiert und Sie nach einer Datei unter diesem Pfad suchen, könnten Sie den PathType-Parameter wie unten gezeigt verwenden. Sie möchten nur überprüfen, ob eine Datei mit dem Namen C:\Foo\Bar existiert.

PS> Test-Path -LiteralPath 'C:\Foo\Bar' -PathType Leaf

Vielleicht müssen Sie stattdessen bestätigen, ob C:\Foo\Bar tatsächlich eine Datei ist. In diesem Fall würden Sie nach einem Container suchen.

PS> Test-Path -LiteralPath 'C:\Foo\Bar' -PathType Container

Einschließen

Wenn Sie den Path-Parameter und Platzhalter verwenden, müssen Sie manchmal genauer werden. In diesem Fall müssen Sie die Include– und Exclude-Parameter überprüfen.

Sagen wir, Sie haben die folgenden Ordner:

  • C:\Foo\Bar1
  • C:\Foo\Bar2
  • C:\Foo\Bar3

Sie möchten überprüfen, ob ein Ordner, der mit Bar beginnt und genau vier Zeichen wie Bar1, Bar2 usw. existiert.

PS> Test-Path -Path C:\Foo\Bar? -PathType Container

Der obige Befehl funktioniert gut, aber jetzt möchten Sie nur Ordner in C:\Foo finden, die Bar2 heißen. In diesem Fall könnten Sie den Include-Parameter verwenden.

PS> Test-Path -Path C:\Foo\Bar? -PathType Container -Include 'Bar2'

Der obige Befehl testet jetzt nur für praktisch einen einzigen Ordner C:\Foo\Bar2. Es wäre wahrscheinlich besser, einfach Test-Path -Path 'C:\Foo\Bar2' -PathType Container zu verwenden.

Ausschließen

Der Ausschließen-Parameter funktioniert ähnlich wie der Einschließen-Parameter, mit dem Unterschied, dass er diesmal Pfade ausschließt, die mit einem bestimmten String übereinstimmen.

Vielleicht möchten Sie sicherstellen, dass sich mindestens eine Datei im C:\Foo-Ordner befindet, und verwenden den folgenden Befehl:

PS> Test-Path -Path C:\Foo\* -PathType Leaf

Der obige Befehl gibt True oder False zurück, wenn sich Dateien in C:\Foo befinden. Aber vielleicht möchten Sie sicherstellen, dass außer Dateien mit der Dateierweiterung txt alle anderen existieren. In diesem Fall könnten Sie den Ausschließen-Parameter verwenden, um alle Dateien mit der Erweiterung txt von der Prüfung auszuschließen.

PS> Test-Path -Path C:\Foo\* -PathType Leaf -Exclude *.txt

Filter

Laut der Dokumentation von Microsoft „gibt der Filter-Parameter einen Filter im Format oder in der Sprache des Anbieters an. Der Wert dieses Parameters gilt als Pfad-Parameter. Die Syntax des Filters, einschließlich der Verwendung von Platzhalterzeichen, hängt vom Anbieter ab“.

Obwohl der Filter-Parameter mit anderen Befehlen wie Get-Childitem verwendet werden sollte, wird er selten bis gar nicht mit Test-Path verwendet. Wenn Sie einen guten Verwendungszweck für den Filter-Parameter gefunden haben, kontaktieren Sie mich bitte auf Twitter unter @adbertram.

Verwandte: Get-ChildItem: Auflisten von Dateien, Registrierung, Zertifikaten und mehr in einem

NewerThan

Haben Sie jemals den Zeitstempel einer Datei überprüfen müssen und eine Entscheidung darauf basierend treffen müssen? Wenn ja, dann sparen die Parameter NewerThan und OlderThan eine Menge Code. Der Parameter NewerThan überprüft, ob der Zeitstempel eines Elements neuer ist als ein bestimmtes Datum.

Der Parameter NewerThan akzeptiert einen String oder ein DateTime-Objekt, um einen Zeitstempel zu repräsentieren, gegen den geprüft werden soll. Um beispielsweise zu überprüfen, ob die Datei C:\Foo\bar.txt nach dem 20. Januar 2021 erstellt wurde, würden Sie Test-Path wie unten gezeigt ausführen.

Test-Path -LiteralPath 'C:\Foo\bar.txt' -NewerThan 'January 20, 2021'
## oder
Test-Path -LiteralPath 'C:\Foo\bar.txt' -NewerThan '1/20/21'

OlderThan

Der Parameter OlderThan ist genau wie der Parameter NewerThan, aber entgegengesetzt. Dieser Parameter überprüft, ob ein Element älter als ein bestimmtes Datum ist.

Test-Path -LiteralPath 'C:\Foo\bar.txt' -OlderThan 'January 20, 2021'
## oder
Test-Path -LiteralPath 'C:\Foo\bar.txt' -OlderThan '1/20/21'

IsValid

Wenn Sie jemals dynamisch einen Pfad in einem Skript erstellt haben, kennen Sie das Problem. Manchmal tippen Sie vielleicht einen Tastenfehler oder bekommen aus irgendeinem Grund ein Sonderzeichen in einem Pfad; wenn ja, dann ist der IsValid-Parameter für Sie.

Der Parameter IsValid ist ein einzigartiger Parameter, der Test-Path nicht in ein Cmdlet verwandelt, das das Vorhandensein eines Elements überprüft, sondern eins, das die Pfadsyntax überprüft. Dieser Parameter bestätigt, ob ein Pfad nur gültig ist.

Zum Beispiel müssen Sie möglicherweise überprüfen, ob ein Pfad syntaktisch gültig ist. Sie arbeiten mit einigen Variablen und verketten sie, um einen Pfad zu erstellen.

Beim Verketten von Pfaden verwenden Sie immer das Join-Path-Cmdlet. Dies dient nur zu Demonstrationszwecken!

$someVar = 'abc:dff'
$rootPath = 'C:\'
$path = "$someVar$rootPath

Um sicherzustellen, dass der von Ihnen dynamisch erstellte Pfad gültig ist, verwenden Sie den IsValid-Parameter wie unten gezeigt. Sie werden feststellen, dass Test-Path False zurückgibt.

PS> Test-Path -LiteralPath $path -IsValid
False

Der Pfad abc:dffC:\ ist kein gültiger Pfad und ermöglicht es Ihnen, aus dieser Situation eine Validierungsroutine zu erstellen.

Wenn Sie PowerShell v6.1.2 oder früher verwenden und die Parameter IsValid und PathType zusammen verwenden, ignoriert Test-Path den Parameter PathType.

Anmeldeinformationen

Auch wenn Sie den Anmeldeinformationen-Parameter bei Test-Path finden, könnten Sie denken, dass Sie ihn verwenden können, um sich als ein anderer Benutzer bei PS-Laufwerken anzumelden. Das ist eine gültige Annahme, aber falsch.

Leider macht der Anmeldeinformationen-Parameter nicht viel mit dem Test-Path-Cmdlet. Microsoft empfiehlt die Verwendung des Invoke-Command-Cmdlets und die Verwendung des Anmeldeinformationen-Parameters dort, wenn Sie Test-Path mit alternativen Anmeldeinformationen aufrufen möchten.

Invoke-Command -Credential (Get-Credential) -Scriptblock {Test-Path -LiteralPath 'C:\'}

Verwandt: Invoke-Command: Der beste Weg, um Remote-Code auszuführen

Source:
https://adamtheautomator.com/powershell-test-path/