Gebruik test-path met powershell om te controleren of een bestand bestaat

In dit artikeltje beschrijf ik hoe je het cmdlet Test-Path kunt gebruiken om te controleren of een bestand bestaat – en ook een .NET alternatief dat een collega ooit moest gebruiken in een of andere SCOM context. Type Get-Help Test-Path voor meer informatie, eventueel met de “-online” switch. Ik demonstreer ook snel de .NET-klasse methode Exists() van de System.IO.File klasse.

Ik demonstreer ook hoe een nieuw bestand kan worden gemaakt als er op dit moment geen bestaat en laat zien hoe op een nette manier kan worden omgegaan met mislukkingen bij het maken van het bestand.

De officiële online documentatie van Microsoft is hier te vinden op deze link.

Tweet

Hoe te controleren of een bestand bestaat met PowerShell

U kunt iets als dit gebruiken voor controle op de opdrachtregel:

PS C:\> Test-Path C:\WindowsTrue

Wees je ervan bewust dat je aanhalingstekens nodig hebt als het pad spaties, haakjes – en mogelijk andere tekens bevat die ik nu even niet kan bedenken. PowerShell voegt automatisch aanhalingstekens toe als je tab compleet is. Ik raad aan enkele aanhalingstekens te gebruiken, omdat dubbele aanhalingstekens variabelen “uitbreiden” (meestal relevant als je “$” in het pad hebt).

PS C:\> Test-Path -Path 'C:\Program Files'True

Anders zie je iets als dit:

PS C:\> Test-Path C:\Program FilesTest-Path : A positional parameter cannot be found that accepts argument 'Files'.

Om er expliciet zeker van te zijn dat het om een bestand gaat en niet om een directory, gebruik je de parameter -PathType, die de volgende mogelijke waarden heeft:

  • Any
  • Leaf (bestand)
  • Container (directory/map)

Schermvoorbeeld

Scriptgebruik

In een script zou u dit meestal gebruiken in een if-instructie. Om te controleren of de map of het bestand niet bestaat, gebruik je “!” of “-not”, en vergeet niet om de Test-Path verklaring tussen haakjes te zetten.

Ook niet vergeten dat als het pad of de bestandsnaam een spatie bevat, je het hele pad tussen aanhalingstekens moet zetten. Enkele aanhalingstekens of dubbele aanhalingstekens werken hetzelfde als er geen “uitbreidbare” delen in het pad of de bestandsnaam staan, maar de iets veiligere keuze is enkele aanhalingstekens. Dit is wat PowerShell standaard gebruikt als je automatisch namen invult met tab op de prompt.

Je moet ook bewust worden gemaakt van het verschil tussen -Path en -LiteralPath. De laatste neemt het pad letterlijk, zoals de naam al aangeeft, terwijl de eerste een wildcard syntaxis ondersteunt. Dit wordt vaak per ongeluk ontdekt wanneer iemand een bestand tegenkomt met oneven haakjes erin, omdat het deel uitmaakt van dezelfde syntaxis die -like gebruikt, zoals in voor één hex cijfer. Dit zal foutmeldingen veroorzaken, althans op eerdere versies van PowerShell, wanneer -Path wordt gebruikt. Gebruik -LiteralPath als je een lijst wilt maken van directorystructuren vanuit één hoofddirectory.

Een bestand maken als het nog niet bestaat

U kunt het cmdlet Set-Content gebruiken om een nieuw bestand te maken als het nog niet bestaat.

Zie mijn voorbeelden en Get-Help Set-Content of Microsoft Docs online hier op deze link.

U kunt ook Out-File en andere methoden gebruiken die ik hier niet zal uitwerken.

U kunt natuurlijk ook een $Variable met de bestandsnaam gebruiken in plaats van de hard-coded tekst hier.

Dit creëert gewoon een bestand met een lege string als inhoud.

Of je kunt het zo doen als je op de opdrachtregel werkt of als het je uitkomt:

"" | Set-Content x:\path\filenamehere.xml

Ik dacht dat het goed was om eerst te demonstreren wat waarschijnlijk als de meest correcte manier van scriptgebruik wordt beschouwd.

Als u wilt testen of het niet lukt om het bestand te maken, kunt u een try {} catch {} statement gebruiken samen met de parameter en waarde “-ErrorAction Stop” voor het cmdlet dat het bestand maakt, bijv.bijvoorbeeld Set-Content of Out-File.

Hier volgt een snel voorbeeld:

Zien is vaak geloven (soms ten onrechte, maar dat is een ander verhaal), dus hier is een screendump van PowerShell ISE die dit voorbeeld uitvoert dat is opgeslagen in een .ps1-scriptbestand.

Mogelijke PathType-waarden opsommen

Een kleine “truc” om de mogelijke opsommingswaarden voor -PathType te zien, is om er een te gebruiken die niet bestaat, zoals deze:

En we zien het gedeelte waar staat:

The possible enumeration values are "Any, Container, Leaf".

Uiting The .NET System.IO.File Class Method “Exists”

U kunt ook de Exists() methode van de .NET System.IO.File class gebruiken:

PS E:\temp> ::Exists('E:\temp\csv1.csv')True

In PowerShell is de “System” namespace optioneel, dus u kunt ook gewoon “Io.File” gebruiken.

Een ding om op te letten, is dat u met deze methode een volledig pad nodig hebt. Om te controleren of een bestand in de huidige directory staat met de IO.File Exists() methode, kun je iets als dit gebruiken, waarbij je typisch een variabele met de bestandsnaam zou gebruiken in plaats van de hier hard gecodeerde “test.ps1”:

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *