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 $Computers
plaatsen:
$Computers = Get-Content -Path C:\temp\DomainMembers.txt
$Computers
is nu een matrix met een computernaam in elk element.