Werken met bestanden en mappen

Navigeren door PowerShell-stations en het bewerken van de items op deze stations is vergelijkbaar met het bewerken van bestanden en mappen op Windows-schijfstations. In dit artikel wordt beschreven hoe u kunt omgaan met specifieke bestands- en mapbewerkingstaken met behulp van PowerShell.

Alle bestanden en mappen in een map weergeven

U kunt alle items rechtstreeks in een map ophalen met behulp van Get-ChildItem. Voeg de optionele parameter Force toe om verborgen of systeemitems weer te geven. Met deze opdracht wordt bijvoorbeeld de directe inhoud van PowerShell Drive C:weergegeven.

Get-ChildItem -Path C:\ -Force

De opdracht bevat alleen de rechtstreeks ingesloten items, net zoals het gebruik van de dir opdracht in cmd.exe of ls in een UNIX-shell. Als u items in de submap wilt weergeven, moet u de parameter Recurse opgeven. De volgende opdracht bevat alles op het C: station:

Get-ChildItem -Path C:\ -Force -Recurse

Get-ChildItem kan items filteren met de parameters Path, Filter, Include en Exclude , maar die zijn doorgaans alleen gebaseerd op de naam. U kunt complexe filters uitvoeren op basis van andere eigenschappen van items met behulp van Where-Object.

Met de volgende opdracht vindt u alle uitvoerbare bestanden in de map Program Files die voor het laatst zijn gewijzigd na 1 oktober 2005 en die niet kleiner zijn dan 1 megabyte of groter dan 10 megabytes:

Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe |
    Where-Object -FilterScript {
        ($_.LastWriteTime -gt '2005-10-01') -and ($_.Length -ge 1mb) -and ($_.Length -le 10mb)
    }

Bestanden en mappen kopiëren

Kopiëren wordt uitgevoerd met Copy-Item. Met de volgende opdracht wordt een back-up van uw PowerShell-profielscript uitgevoerd:

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak')
}

Met de Test-Path opdracht wordt gecontroleerd of het profielscript bestaat.

Als het doelbestand al bestaat, mislukt de kopieerpoging. Als u een vooraf bestaande bestemming wilt overschrijven, gebruikt u de parameter Force :

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak') -Force
}

Deze opdracht werkt zelfs wanneer de bestemming het kenmerk Alleen-lezen heeft.

Het kopiëren van mappen werkt op dezelfde manier. Met deze opdracht wordt de map C:\temp\test1 recursief naar de nieuwe map C:\temp\DeleteMe gekopieerd:

Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe

U kunt ook een selectie van items kopiëren. Met de volgende opdracht worden alle .txt bestanden gekopieerd die zich ergens in C:\data bevinden:C:\temp\text

Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text

U kunt nog steeds systeemeigen opdrachten uitvoeren zoals xcopy.exe en robocopy.exe bestanden kopiëren.

Bestanden en mappen maken

Het maken van nieuwe items werkt op dezelfde wijze voor alle PowerShell-providers. Als een PowerShell-provider meer dan één type item heeft, bijvoorbeeld de PowerShell-provider van het bestandssysteem, moet u het itemtype opgeven.

Met deze opdracht maakt u een nieuwe map C:\temp\New Folder:

New-Item -Path 'C:\temp\New Folder' -ItemType Directory

Met deze opdracht maakt u een nieuw leeg bestand C:\temp\New Folder\file.txt

New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType File

Belangrijk

Wanneer u de schakeloptie Force gebruikt met de New-Item opdracht om een map te maken en de map al bestaat, wordt de map niet overschreven of vervangen. Het bestaande mapobject wordt gewoon geretourneerd. Als u echter een New-Item -Force bestand gebruikt dat al bestaat, wordt het bestand overschreven.

Alle bestanden en mappen in een map verwijderen

U kunt ingesloten items verwijderen met behulp van Remove-Item, maar u wordt gevraagd om de verwijdering te bevestigen als het item iets anders bevat. Als u bijvoorbeeld probeert de map C:\temp\DeleteMe met andere items te verwijderen, wordt u gevraagd om bevestiging voordat u de map verwijdert:

Remove-Item -Path C:\temp\DeleteMe
Confirm
The item at C:\temp\DeleteMe has children and the Recurse parameter wasn't
specified. If you continue, all children will be removed with the item. Are you
sure you want to continue?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):

Als u niet wilt worden gevraagd om elk ingesloten item, geeft u de parameter Recurse op:

Remove-Item -Path C:\temp\DeleteMe -Recurse

Een lokale map toewijzen als station

U kunt ook een lokale map toewijzen met behulp van de New-PSDrive opdracht. Met de volgende opdracht maakt u een lokaal station P: dat is geroot in de lokale map Program Files, alleen zichtbaar vanuit de PowerShell-sessie:

New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem

Net als bij netwerkstations zijn stations die zijn toegewezen in PowerShell direct zichtbaar voor de PowerShell-shell. Als u een toegewezen station wilt maken dat zichtbaar is op basis van Bestandenverkenner, gebruikt u de parameter Persistent. Alleen externe paden kunnen echter worden gebruikt met Persistent.

Een tekstbestand lezen in een matrix

Een van de meest voorkomende opslagindelingen voor tekstgegevens is in een bestand met afzonderlijke regels die worden behandeld als afzonderlijke gegevenselementen. De Get-Content cmdlet kan in één stap worden gebruikt om een volledig bestand te lezen, zoals hier wordt weergegeven:

Get-Content -Path $PROFILE
# Load modules and change to the PowerShell-Docs repository folder
Import-Module posh-git
Set-Location C:\Git\PowerShell-Docs

Get-Content behandelt de gegevens die uit het bestand worden gelezen als een matrix, met één element per regel bestandsinhoud. U kunt dit bevestigen door de lengte van de geretourneerde inhoud te controleren:

PS> (Get-Content -Path $PROFILE).Length
3

Deze opdracht is het handigst voor het ophalen van lijsten met informatie in PowerShell. U kunt bijvoorbeeld een lijst met computernamen of IP-adressen opslaan in het bestand C:\temp\domainMembers.txt, met één naam op elke regel van het bestand. U kunt de Get-Content bestandsinhoud ophalen en in de variabele $Computersplaatsen:

$Computers = Get-Content -Path C:\temp\DomainMembers.txt

$Computers is nu een matrix met een computernaam in elk element.