PowerShell Test-Path Cmdlet: Bestanden, Sleutels en Meer Verifiëren

Als u een pad naar een bestand, register sleutel, certificaat, of een ander PowerShell-drive-pad moet valideren, heeft u de Test-Path cmdlet nodig.

De Test-Path cmdlet is een eenvoudige maar nuttige manier om snel veel eigenschappen van een bestand en andere items te controleren. Het kan controleren of een bestand bestaat (of andere itemtypen), of een tekenreeks in het juiste padformaat staat, of zelfs of een item nieuwer is dan of ouder dan een specifieke tijd.

In deze tutorial ga je alles leren over de PowerShell Test-Path cmdlet en hoe je het kunt gebruiken om je PowerShell-scripts te verbeteren.

Vereisten

Als je de voorbeelden in deze tutorial wilt volgen, heb je één ding nodig; PowerShell. Meer specifiek zal de tutorial PowerShell v7.03 op Windows 10 gebruiken, hoewel veel van de technieken die je leert ook van toepassing zullen zijn op oudere versies.

Wat doet de Test-Path Cmdlet?

De PowerShell Test-Path cmdlet is een van de eenvoudigste commando’s. Het is een opdracht die al sinds het begin in PowerShell zit en slechts twee waarden retourneert; Waar of Onwaar.

Maar laat de eenvoud u niet misleiden; het zal u zo veel tijd besparen bij het valideren van informatie in uw PowerShell-scripts.

Denk aan de PowerShell Test-Path cmdlet als kwaliteitscontrole bij het werken met PowerShell-providers en drives. Bij het schrijven van een script zul je vaak werken met verschillende items die zich bevinden in PowerShell-drives. PowerShell-drives zoals C:\, HKLM, Cert, enzovoort.

Test-Path werkt niet met alle PS-drives. Als je bijvoorbeeld probeert Test-Path te gebruiken tegen een registerkey, zal het werken. Als je echter Test-Path probeert te gebruiken tegen een registerwaarde, zal het elke keer False retourneren.

Als je nieuwsgierig bent, voer dan nu het Get-PSDrive cmdlet uit in PowerShell en merk alle PS-drives op die voor je verschijnen.

PS Drives after running Get-PSDrive

Al deze drives hebben paden erin zoals C:\Windows, HKLM:\Software, enz. Bij het werken met paden in je PowerShell-scripts is het altijd goed om eerst te testen of het pad geldig is of dat het al dan niet bestaat. Dit is wat PowerShell’s Test-Path doet.

Test-Path definieert een voorwaarde die True of False retourneert, afhankelijk van of een specifieke voorwaarde is voldaan (meestal of een bestand/map, registerkey, certificaat, of zelfs een variabele al dan niet bestaat).

Test-Path Parameters en Gebruik

Zoals veel andere PowerShell-cmdlets heeft het Test-Path-cmdlet verschillende parameters die het gedrag ervan veranderen. Laten we nu elke parameter behandelen en demonstreren hoe het werkt en welke resultaten je kunt verwachten.

Pad

De parameter Pad is een verplichte parameter die je gebruikt bij elke uitvoering van Test-Path. De parameter Pad definieert het pad van de PSDrive dat je wilt testen op het bestaan ervan.

Als je bijvoorbeeld wilt testen of de map C:\Foo bestaat, geef je het juiste pad op aan de Pad-parameter. Vervolgens, afhankelijk van of C:\Foo daadwerkelijk bestaat of niet, zou Test-Path ofwel True of False retourneren.

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

Dezelfde techniek kan ook worden gebruikt voor elk item-pad. Misschien wil je testen of de registersleutel HKLM:\Software\Foo bestaat. Gebruik eenvoudig het registersleutelpad met de Pad-parameter.

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

Weet dat alle technieken gedemonstreerd in deze tutorial zullen werken met elk PowerShell-stuurprogrammapad.

Gebruik van Wildcards

Wat gebeurt er als je niet per se geeft om een pad met een letterlijke waarde. In plaats daarvan wil je gewoon controleren of een pad overeenkomt met een specifiek patroon. In dat geval kun je wildcards gebruiken in de waarde van Pad.

Misschien wil je controleren of je C:\Foo-map een submap bevat die begint met Bar. In dat geval kun je een wildcard gebruiken.

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

Zodra u bovenstaand commando uitvoert, zal Test-Path controleren of er een map bestaat die begint met Bar en True of False retourneren, afhankelijk van of een map die aan die criteria voldoet, al dan niet bestaat.

Asterisken (*) komen overeen met één of meer tekens, maar u kunt ook vraagtekens (?) gebruiken om gedetailleerder te testen op één karakter.

Als voorbeeld kunt u met het bovenstaande scenario, als de map C:\Foo\Bar1 bestaat, testen op een submap van Foo die begint met Bar en exact vier tekens lang is met het volgende commando.

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

Als u om de een of andere reden de Path-parameter met wildcards wilt gebruiken maar een wildcard-teken zoals * letterlijk wilt matchen, kunt u altijd de wildcard-tekens escapen met een backtick (`).

LiteralPath

De LiteralPath-parameter is bijna identiek aan de Path-parameter met één uitzondering; het staat geen wildcards toe. Het gebruik van LiteralPath zal de waarde van het pad letterlijk interpreteren.

Als u bijvoorbeeld een asterisk of vraagteken probeert te gebruiken in de padwaarde met LiteralPath, negeert Test-Path volledig de wildcard-tekens en test letterlijk op C:\Foo\Bar?, zoals in het onderstaande voorbeeld.

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

U moet LiteralPath als de standaard padparameter gebruiken als u geen wildcard-tekens hoeft te gebruiken om ervoor te zorgen dat Test-Path het pad test dat u verwacht.

PathType

Standaard, wanneer u Test-Path uitvoert en het een pad geeft, retourneert het True als het iets vindt op dat pad. Het item met een pad kan een container zijn, zoals een bestandsmap, een registersleutel, een certificaatopslag, enzovoort, of een blad, zoals een bestand, registerwaarde of certificaat.

U kunt Test-Path dwingen om meer gedetailleerd te worden en specifiek te testen voor een container- of bladitem met behulp van de PathType-parameter.

Test-Path gebruikt standaard de PathType-waarde Any.

Als er bijvoorbeeld een map is op C:\Foo\Bar en u zoekt naar een bestand op dat pad, kunt u de PathType-parameter gebruiken zoals hieronder wordt weergegeven. U wilt alleen controleren of een bestand genaamd C:\Foo\Bar bestaat.

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

Misschien moet u in plaats daarvan bevestigen of C:\Foo\Bar eigenlijk een bestand is. In dat geval controleert u op een container.

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

Opnemen

Als u de Path-parameter en wildcards gebruikt, moet u soms specifieker worden. In dat geval moet u de Include– en Exclude-parameters bekijken.

Laten we zeggen dat u de volgende mappen heeft:

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

U wilt controleren of er mappen zijn die beginnen met Bar die precies vier tekens bevatten, zoals Bar1, Bar2, enzovoort.

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

De bovenstaande opdracht werkt prima, maar nu wilt u alleen mappen vinden in C:\Foo met de naam Bar2. In dat geval kunt u de Include-parameter gebruiken.

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

De bovenstaande opdracht test nu alleen essentieel een enkele map C:\Foo\Bar2. Het is waarschijnlijk beter om gewoon Test-Path -Path 'C:\Foo\Bar2' -PathType Container te gebruiken in plaats daarvan.

Uitsluiten

De Exclude parameter werkt op dezelfde manier als de Include parameter, behalve dat deze keer paden worden uitgesloten die overeenkomen met een string.

Misschien wilt u ervoor zorgen dat er ten minste één bestand aanwezig is in de map C:\Foo, en gebruikt u de volgende opdracht:

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

De bovenstaande opdracht retourneert True of False als er bestanden zijn in C:\Foo. Maar misschien wilt u ervoor zorgen dat er geen bestanden behalve die met de extensie txt bestaan. In dat geval kunt u de Exclude parameter gebruiken met een wildcard om alle bestanden met de extensie txt uit te sluiten van testen.

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

Filter

Volgens de documentatie van Microsoft, specificeert de Filter parameter “een filter in het formaat of de taal van de provider. De waarde van deze parameter kwalificeert als de Path parameter. De syntaxis van het filter, inclusief het gebruik van wildcard-karakters, is afhankelijk van de provider”.

Hoewel de Filter parameter moet worden gebruikt met andere cmdlets zoals Get-Childitem, wordt het zelden, zo niet nooit, gebruikt met Test-Path. Als u een goede toepassing voor de Filter parameter hebt gevonden, neem dan contact op via Twitter op @adbertram.

Gerelateerd: Get-ChildItem: Bestanden, Register, Certificaat en Meer als Eén Weergeven

NewerThan

Heb je ooit de tijdstempel van een bestand moeten controleren en daarop een beslissing moeten nemen? Zo ja, dan besparen de parameters NewerThan en OlderThan veel code. De parameter NewerThan controleert of de tijdstempel van een item nieuwer is dan een specifieke datum.

De parameter NewerThan accepteert een tekenreeks of een DateTime-object om een tijdstempel te vertegenwoordigen om tegen te controleren. Bijvoorbeeld, om te controleren of het bestand C:\Foo\bar.txt is gemaakt na 20 januari 2021, zou je Test-Path als volgt uitvoeren.

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

OlderThan

De parameter OlderThan is precies hetzelfde als de parameter NewerThan, maar het tegenovergestelde. Deze parameter controleert of een item ouder is dan een specifieke datum.

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

IsValid

Als je ooit dynamisch een pad hebt opgebouwd in een script, ken je de worsteling. Soms typ je per ongeluk een toets verkeerd of krijg je op de een of andere manier een speciaal teken in een pad; als dat het geval is, is de parameter IsValid iets voor jou.

De parameter IsValid is een unieke parameter die van Test-Path geen cmdlet maakt die controleert op het bestaan van een item, maar een die controleert op de syntaxis van het pad. Deze parameter bevestigt alleen of een pad geldig is of niet.

Bijvoorbeeld, misschien moet je controleren of een pad syntactisch geldig is. Je werkt met een paar variabelen en voegt ze samen om een pad te bouwen.

Wanneer je paden samenvoegt, gebruik altijd de Join-Path cmdlet. Dit is slechts ter illustratie!

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

Om ervoor te zorgen dat het pad dat je dynamisch hebt gemaakt geldig is, gebruik je de IsValid-parameter zoals hieronder. Je zult merken dat Test-Path False retourneert.

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

Het pad abc:dffC:\ is nu geen geldig pad, waardoor je een validatieroutine kunt maken voor deze situatie.

Als je PowerShell v6.1.2 of eerder gebruikt en de parameters IsValid en PathType samen gebruikt, negeert Test-Path de PathType-parameter.

Credential

Hoewel je de Credential-parameter vindt bij Test-Path, zou je kunnen denken dat je deze kunt gebruiken om je te authenticeren bij PS-drives als een andere gebruiker. Dat is een geldige veronderstelling, maar het klopt niet.

Helaas doet de Credential-parameter niet veel met de Test-Path cmdlet. Microsoft raadt aan de Invoke-Command cmdlet te gebruiken en daar de Credential-parameter te gebruiken als je Test-Path met andere referenties wilt uitvoeren.

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

Gerelateerd: Invoke-Command: De beste manier om externe code uit te voeren

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