Met bestanden en mappen werken
Navigeren door Windows PowerShell stations en het bewerken van de items op deze stations is vergelijkbaar met het bewerken van bestanden en mappen op Windows fysieke schijfstations. In dit artikel wordt beschreven hoe u specifieke bestands- en mapbewerkingstaken kunt uitvoeren met behulp van PowerShell.
Alle bestanden en mappen in een map weergeven
U kunt alle items rechtstreeks in een map krijgen 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 Windows PowerShell station C weergegeven (dit is hetzelfde als de Windows station C):
Get-ChildItem -Path C:\ -Force
Met de opdracht worden alleen de rechtstreeks opgenomen items vermeld, net zoals bij het gebruik van de opdracht of in een Cmd.exe DIR UNIX ls shell. Als u ingesloten items wilt zien, moet u ook de -Recurse parameter opgeven. (Dit kan erg lang duren.) Om alles op de C-schijf weer te geven:
Get-ChildItem -Path C:\ -Force -Recurse
Get-ChildItem kan items filteren met de parameters Path, Filter, Include en Exclude, maar deze 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 worden alle uitvoerbare bestanden gevonden in de map Program Files die voor het laatst zijn gewijzigd na 1 oktober 2005 en die niet kleiner zijn dan 1 MB of groter zijn dan 10 MB:
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 gedaan met Copy-Item . De volgende opdracht back-up C: \boot.ini naar C: \ boot.bak:
Copy-Item -Path C:\boot.ini -Destination C:\boot.bak
Als het doelbestand al bestaat, mislukt de kopieerpoging. Als u een bestaande bestemming wilt overschrijven, gebruikt u de parameter Force:
Copy-Item -Path C:\boot.ini -Destination C:\boot.bak -Force
Met deze opdracht werkt zelfs wanneer de bestemming alleen-lezen is.
Het kopiëren van mappen werkt op dezelfde manier. Met deze opdracht wordt de C:\temp\test1 map recursief naar de C:\temp\DeleteMe nieuwe map gekopieerd:
Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe
U kunt ook een selectie items kopiëren. Met de volgende opdracht worden alle .txt waar dan ook in gekopieerd C:\data naar C:\temp\text :
Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text
U kunt nog steeds andere hulpprogramma's gebruiken om kopieën van het bestandssysteem uit te voeren. XCOPY-, ROBOCOPY- en COM-objecten, zoals scripting.FileSystemObject, werken allemaal in Windows PowerShell. U kunt bijvoorbeeld de com-klasse scripthostscripts Windows Scripting.FileSystem gebruiken om een back-up te maken C:\boot.ini naar C:\boot.bak :
(New-Object -ComObject Scripting.FileSystemObject).CopyFile('C:\boot.ini', 'C:\boot.bak')
Bestanden en mappen maken
Het maken van nieuwe items werkt hetzelfde voor alle Windows PowerShell providers. Als een Windows PowerShell-provider meer dan één type item heeft, bijvoorbeeld de Windows PowerShell-provider FileSystem maakt onderscheid tussen mappen en bestanden, 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 schakelknop Force gebruikt met de opdracht om een map te maken en de map al bestaat, wordt de map niet New-Item overschreven of vervangen. Er wordt gewoon het bestaande mapobject retourneren. Als u echter gebruikt voor een bestand dat al bestaat, wordt het bestand New-Item -Force volledig overschreven.
Alle bestanden en mappen in een map verwijderen
U kunt ingesloten items verwijderen met behulp van , maar u wordt gevraagd om de verwijdering te bevestigen als het Remove-Item item iets anders bevat. Als u bijvoorbeeld probeert de map met andere items te verwijderen, wordt Windows PowerShell u om bevestiging gevraagd voordat C:\temp\DeleteMe u de map verwijdert:
Remove-Item -Path C:\temp\DeleteMe
Confirm
The item at C:\temp\DeleteMe has children and the Recurse parameter was not
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 om elk ingesloten item wilt worden gevraagd, geeft u de parameter Recurse op:
Remove-Item -Path C:\temp\DeleteMe -Recurse
Een lokale map toewijzen als een station
U kunt ook een lokale map in kaart brengen met behulp van de New-PSDrive opdracht . Met de volgende opdracht maakt u een lokaal station dat is geroot in de lokale map P: 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 Windows PowerShell direct zichtbaar voor de Windows PowerShell shell. Als u een kaartstation wilt maken dat zichtbaar is vanuit Verkenner, is de parameter -Persist nodig. Met Persist kunnen echter alleen externe paden worden gebruikt.
Een tekstbestand in een matrix lezen
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 worden gebruikt om een volledig bestand in één stap te lezen, zoals hier wordt weergegeven:
PS> Get-Content -Path C:\boot.ini
[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional"
/noexecute=AlwaysOff /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=" Microsoft Windows XP Professional
with Data Execution Prevention" /noexecute=optin /fastdetect
Get-Content behandelt de gegevens die uit het bestand worden gelezen al 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 C:\boot.ini).Length
6
Met deze opdracht is het handig om lijsten met informatie rechtstreeks in Windows PowerShell op te nemen. U kunt bijvoorbeeld een lijst met computernamen of IP-adressen opslaan in een bestand , met één C:\temp\domainMembers.txt naam op elke regel van het bestand. U kunt gebruiken Get-Content om de bestandsinhoud op te halen en deze in de variabele te $Computers zetten:
$Computers = Get-Content -Path C:\temp\DomainMembers.txt
$Computers is nu een matrix met een computernaam in elk element.