Arbeta med filer och mappar

Att navigera genom PowerShell-enheter och manipulera objekten på dem liknar att manipulera filer och mappar på Windows-diskenheter. I den här artikeln beskrivs hur du hanterar specifika uppgifter för fil- och mappmanipulering med hjälp av PowerShell.

Visa en lista över alla filer och mappar i en mapp

Du kan hämta alla objekt direkt i en mapp med hjälp av Get-ChildItem. Lägg till den valfria Force-parametern för att visa dolda objekt eller systemobjekt. Det här kommandot visar till exempel det direkta innehållet i PowerShell Drive C:.

Get-ChildItem -Path C:\ -Force

Kommandot visar bara de direkt inneslutna objekten, ungefär som med kommandot dir i cmd.exe eller ls i ett Unix-gränssnitt. Om du vill visa objekt i undermappen måste du ange parametern Recurse. Följande kommando visar allt på den C:-enheten:

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

Get-ChildItem kan filtrera objekt med Path, Filter, Includeoch Exclude parameters, men dessa baseras vanligtvis bara på namn. Du kan utföra komplex filtrering baserat på andra egenskaper för objekt med hjälp av Where-Object.

Följande kommando hittar alla körbara filer i mappen Programfiler som senast ändrades efter den 1 oktober 2005 och som varken är mindre än 1 megabyte eller större än 10 megabyte:

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

Kopiera filer och mappar

Kopieringen är klar med Copy-Item. Följande kommando säkerhetskopierar ditt PowerShell-profilskript:

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

Kommandot Test-Path kontrollerar om profilskriptet finns.

Om målfilen redan finns misslyckas kopieringsförsöket. Om du vill skriva över ett befintligt mål använder du parametern Force:

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

Det här kommandot fungerar även när målet är skrivskyddat.

Mappkopiering fungerar på samma sätt. Det här kommandot kopierar mappen C:\temp\test1 till den nya mappen C:\temp\DeleteMe rekursivt:

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

Du kan också kopiera ett urval av objekt. Följande kommando kopierar alla .txt filer som finns var som helst i C:\data till C:\temp\text:

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

Du kan fortfarande köra interna kommandon som xcopy.exe och robocopy.exe för att kopiera filer.

Skapa filer och mappar

Att skapa nya objekt fungerar på samma sätt på alla PowerShell-leverantörer. Om en PowerShell-provider har mer än en typ av objekt, till exempel FileSystem PowerShell-providern, skiljer mellan kataloger och filer, måste du ange objekttypen.

Det här kommandot skapar en ny mapp C:\temp\New Folder:

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

Det här kommandot skapar en ny tom fil C:\temp\New Folder\file.txt

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

Viktigt!

När du använder Force switch med kommandot New-Item för att skapa en mapp och mappen redan finns inte skriva över eller ersätta mappen. Det returnerar helt enkelt det befintliga mappobjektet. Men om du använder New-Item -Force på en fil som redan finns skrivs filen över.

Ta bort alla filer och mappar i en mapp

Du kan ta bort inneslutna objekt med hjälp av Remove-Item, men du uppmanas att bekräfta borttagningen om objektet innehåller något annat. Om du till exempel försöker ta bort mappen C:\temp\DeleteMe som innehåller andra objekt uppmanar PowerShell dig att bekräfta innan du tar bort mappen:

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"):

Om du inte vill bli tillfrågad om varje inneslutet objekt anger du parametern Recurse:

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

Mappa en lokal mapp som en enhet

Du kan också mappa en lokal mapp med hjälp av kommandot New-PSDrive. Följande kommando skapar en lokal enhet P: rotad i den lokala Program Files-katalogen, endast synlig från PowerShell-sessionen:

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

Precis som med nätverksenheter är enheter som mappas i PowerShell omedelbart synliga för PowerShell-gränssnittet. Om du vill skapa en mappad enhet som syns i Utforskaren använder du parametern Persist. Det går dock bara att använda fjärrsökvägar med Bevara.

Läsa en textfil i en matris

Ett av de vanligaste lagringsformaten för textdata finns i en fil med separata rader som behandlas som distinkta dataelement. Cmdleten Get-Content kan användas för att läsa en hel fil i ett steg, enligt följande:

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 behandlar data som läss från filen som en matris, med ett element per rad med filinnehåll. Du kan bekräfta detta genom att kontrollera Längd för det returnerade innehållet:

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

Det här kommandot är mest användbart för att hämta listor med information till PowerShell. Du kan till exempel lagra en lista över datornamn eller IP-adresser i filen C:\temp\domainMembers.txt, med ett namn på varje rad i filen. Du kan använda Get-Content för att hämta filinnehållet och placera dem i variabeln $Computers:

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

$Computers är nu en matris som innehåller ett datornamn i varje element.