PowerShell Bestaan Controle: Uitgebreide Gids

Gebruik je PowerShell om bestanden te maken, lezen, bijwerken en verwijderen? Zo ja, dan heb je waarschijnlijk fouten ervaren wanneer de doelbestanden niet bestaan of al bestaan. Gelukkig zijn er manieren in PowerShell om te controleren of een bestand bestaat voordat je er iets mee doet.

Bijvoorbeeld, in plaats van je code meteen het bestand te laten maken, is het beter om te testen of het bestand al bestaat. Zoals getoond in de onderstaande schermafbeelding, kun je betere code schrijven en duidelijke output bereiken.

Creating a file that already exists

In dit artikel leer je de verschillende manieren om PowerShell te gebruiken om te controleren of een bestand bestaat. Je leert ook hoe je elk van deze manieren kunt gebruiken om betere code en resultaten te produceren met foutafhandelingslogica.

Vereisten

Verminder service desk oproepen & update cache referenties voor externe gebruikers zelfs buiten VPN met een self-service wachtwoord reset oplossing. Ontvang een demo van Specops uReset!

Dit artikel is een handleiding waarin je leert van verschillende voorbeelden. En om de voorbeelden te volgen, heb je het volgende nodig:

  • Code-editor. De aanbevolen zijn Visual Studio Code en Atom, die op verschillende platforms werken. Je kunt ook Windows PowerShell ISE gebruiken als je op een Windows-computer werkt.
  • Windows PowerShell 5.1 (Desktop) of PowerShell 7.1 (Core). De commando’s en scripts in dit artikel zijn van toepassing op beide versies van PowerShell. Of je nu Windows, Linux of macOS gebruikt, zolang je PowerShell geïnstalleerd hebt, zit je goed.

Gerelateerd: Hoe PowerShell 7 te downloaden en te installeren op Windows, Linux en macOS

Het Gebruik van PowerShell om te Controleren of een Bestand Bestaat

Dit artikel behandelt drie methoden waarmee je PowerShell kunt gebruiken om te controleren of een bestand bestaat. Het gebruik van deze drie methoden verschilt, maar het concept en het einddoel zijn hetzelfde. Deze drie manieren zijn:

  • Test-Path Cmdlet.
  • Get-Item en Get-ChildItem Cmdlet.
  • System.IO.File Class.

Er zullen voorbeelden en demonstraties zijn van elk van deze drie methoden, inclusief hoe ze te gebruiken met foutafhandeling.

Het Gebruik van Test-Path

De eerste methode is het Test-Path-cmdlet, specifiek ontworpen om te bepalen of een pad of bestand bestaat. Wanneer je dit cmdlet gebruikt om te testen of een bestand bestaat, is het resultaat waar of onwaar. Het resultaat geeft aan of het bestand bestaat of niet.

Hieronder staat de basis syntaxis om het Test-Path-cmdlet te laten werken bij het controleren van een bestand.

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

Bijvoorbeeld, als je moet controleren of zo’n bestand met de naam C:\temp\important_file.txt bestaat, gebruik dan de onderstaande code. Let op dat het gedeelte -PathType Leaf de cmdlet vertelt om expliciet te controleren op een bestand en niet op een map.

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

Wanneer je het bovenstaande commando uitvoert in PowerShell, retourneert het resultaat True als het bestand bestaat. Anders zou het resultaat False zijn, zoals je kunt zien op de onderstaande screenshot.

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

Gerelateerd: Hoe de PowerShell Test-Path Cmdlet te gebruiken

Voorbeeld: Een Bestand Maken Als Het Bestand Niet Bestaat

Dit voorbeeld is een typisch gebruiksscenario om bestanden op een gespecificeerde locatie te maken. Om de fout “bestand bestaat al” te voorkomen, controleert het script of het bestand al bestaat voordat het wordt gemaakt. Als het bestand bestaat, toont het script een bericht en probeert het het bestand niet meer te maken.

Kopieer de onderstaande code en sla deze op in een bestand genaamd Create-NewFile.ps1. Zorg ervoor dat je de waarde van de variabele $path wijzigt als je de uitvoerlocatie van het bestand wilt wijzigen. Voer na het opslaan van het script het uit in PowerShell om te testen.

# Create-NewFile.ps1

# Volledig pad van het bestand
$file = 'c:\temp\important_file.txt'

#Als het bestand niet bestaat, maak het dan.
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
     }
 }
# Als het bestand al bestaat, toon het bericht en doe niets.
 else {
     Write-Host "Cannot create [$file] because a file with that name already exists."
 }

De onderstaande schermafbeelding toont de twee verschillende resultaten. De eerste is wanneer het script wordt uitgevoerd terwijl het bestand niet bestaat. De tweede is nadat het bestand is gemaakt en al bestaat.

Running the PowerShell script to create a file

Gerelateerd: Terug naar de basis: Hoe voer je een PowerShell-script uit

Gebruik van Get-Item en Get-ChildItem

Het doel van de cmdlet Get-Item is om het item op een opgegeven locatie op te halen. In vergelijking daarmee is de cmdlet Get-ChildItem bedoeld om de items en subitems op te halen op een of meer opgegeven locaties. De functionaliteit van deze twee cmdlets is niet expliciet bedoeld om te controleren of bestanden bestaan.

Wat gebeurt er als je Get-Item of Get-ChildItem gebruikt om een item op te halen dat niet bestaat? Je krijgt een foutmelding voor elk ontbrekend bestand. Neem de onderstaande commando’s als voorbeeld.

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

Stel dat het bestand c:\temp\important_file.txt niet bestaat. Elk van de bovenstaande commando’s retourneert een foutmelding. Zoals je kunt zien in het onderstaande voorbeeld, is de foutmelding voor beide commando’s hetzelfde.

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

Voorbeeld: Archivering van het bestaande bestand en aanmaken van een nieuw bestand

In dit voorbeeld gebruikt het script de cmdlets Get-Item en Test-Path. De logica van dit script is als volgt:

  • Test of de archiefmap bestaat met behulp van Test-Path.
    • Als de archiefmap niet bestaat, maakt het script een nieuwe archiefmap aan in dit formaat – yyyy-MMM-dd_hh-mm-ss-tt.
    • Vervolgens verplaatst het script het oude bestand naar de archiefmap.
  • Test of het bestand al bestaat met behulp van Get-Item.
    • Als het bestand bestaat, verplaatst het script het eerst naar de archiefmap. Vervolgens maakt het script het nieuwe bestand aan op de oorspronkelijke locatie.
    • Als het bestand niet bestaat, maakt het script het nieuwe bestand aan.

Kopieer de onderstaande code en sla het op als Create-NewFileAfterArchive.ps1. Nadat het script is opgeslagen, voer het uit in PowerShell en controleer de resultaten.

# Create-NewFileAfterArchive.ps1

# Volledig pad naar het bestand
$file = 'c:\temp\important_file.txt'

# Volledig pad naar de archiveringsmap
$archiveFolder = "c:\temp\archive_$(get-date -Format 'yyyy-MMM-dd_hh-mm-ss-tt')\"

# Als het bestand bestaat, verplaats het naar de archiefmap en maak vervolgens een nieuw bestand aan.
if (Get-Item -Path $file -ErrorAction Ignore) {
    try {
        ## Als de archiefmap niet bestaat, maak deze nu aan.
        if (-not(Test-Path -Path $archiveFolder -PathType Container)) {
            $null = New-Item -ItemType Directory -Path $archiveFolder -ErrorAction STOP
        }
        ## Verplaats het bestaande bestand naar het archief.
        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
 }

Tip: De parameter -ErrorAction Ignore onderdrukt de fout (wordt niet weergegeven in de console) en neemt de fout ook niet op in de automatische variabele $error.

In de onderstaande schermafbeelding heeft de eerste uitvoering van het script het bestand c:\temp\important_file.txt gemaakt. De daaropvolgende uitvoeringen van het script hebben telkens een nieuwe archiefmap gemaakt, het bestaande bestand naar de archiefmap verplaatst en vervolgens een nieuw bestand gemaakt in c:\temp\important_file.txt.

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

Gebruik van de [System.IO.File]::Exists() .NET-methode

De laatste methode om te leren in dit artikel is de System.IO.File .NET-klasse, specifiek de Exists()-methode. Een van de sterke punten van PowerShell is het vermogen om .NET-klassen en -methoden te importeren en te gebruiken.

Bijvoorbeeld, om de Exists()-methode in PowerShell te gebruiken om te controleren of een bestand bestaat, gebruik de onderstaande code.

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

De bovenstaande methode levert een booleaanse uitkomst op – true of false. Als het resultaat true retourneert, betekent dit dat het doelbestand bestaat. Anders is het resultaat false wanneer het doelbestand niet bestaat.

In het onderstaande voorbeeld controleert de opdracht op de aanwezigheid van het bestand c:\temp\important_file.txt.

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

Zoals te zien is in het onderstaande resultaat, retourneert de uitkomst true, wat bevestigt dat het bestand bestaat.

Using System.IO.File class in PowerShell

Met deze .NET-methode kunt u ook gebruikmaken van ternary-operaties, zoals het onderstaande voorbeeld. In plaats van de standaard true- of false-resultaten weer te geven, kunt u het resultaatbericht aanpassen met een kortere implementatie. De ternary-operator in dit voorbeeld is echter alleen van toepassing op PowerShell 7+.

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

Voorbeeld: Het bijwerken van de bestandsinhoud als het bestand bestaat

Deze voorbeeldscript bijwerkt het tekstbestand door een nieuwe GUID-waarde toe te voegen. De inhoud wordt echter alleen bijgewerkt als het bestand bestaat. Anders toont het script een bericht en doet verder niets.

Kopieer de onderstaande script en sla het op als Update-FileContents.ps1. Pas indien nodig de bestandspadwaarde van de $file-variabele aan. Voer vervolgens het script uit in PowerShell om te testen.

# Update-FileContents.ps1

#Volledig pad van het bestand
$file = 'c:\temp\important_file.txt'

#Als het bestand bestaat, voeg dan een nieuwe GUID-waarde toe aan het bestand.
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
     }    
 }

#Als het bestand niet bestaat, toon dan een bericht en doe niets.
 else {
     Write-Host "The file [$file] could not be updated because it does not exist."
 }

Je kunt zien in de onderstaande screenshot dat het script het bestand bij elke uitvoering heeft bijgewerkt. De update vond plaats omdat de [System.IO.File]::Exists()-methode bevestigde dat het bestand c:\temp\important_file.txt bestaat.

Uiteindelijk bevestigde het gebruik van de opdracht gc c:\temp\important_file.txt om de inhoud van het bestand te lezen dat het script het bestand heeft bijgewerkt met de GUID-waarden.

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

Gerelateerd: Gebruik van PowerShell Data Type Accelerators om het coderen te versnellen

Conclusie

Verlaag het aantal calls naar de servicedesk & update cache referenties voor externe gebruikers zelfs buiten VPN met een self-service wachtwoordresetoplossing. Krijg een demo van Specops uReset!

In dit artikel heb je geleerd dat er meer dan één manier is om met PowerShell te controleren of een bestand bestaat. Het is een goede praktijk om de aanwezigheid van een bestand te controleren voordat er wijzigingen aan worden aangebracht.

Je hebt geleerd hoe je de cmdlets Get-Item, Get-ChildItem en Test-Path gebruikt. Evenals de [System.IO.File]::Exists() .NET methode. De voorbeelden hebben je laten zien hoe je technieken gebruikt en hoe je ze combineert met logica voor foutafhandeling.

Stop met het doorstaan van die foutmeldingen. Overwin ze door code toe te voegen om te controleren of een bestand bestaat voordat er bestandsgerelateerde bewerkingen worden uitgevoerd. De technieken die je hier hebt geleerd, behandelen alleen de basis, en het is nu aan jou om ze te verbeteren.

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