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-enheten C:.

Get-ChildItem -Path C:\ -Force

Kommandot visar endast de direkt inneslutna objekten dir , ungefär som att använda kommandot 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å C: enheten:

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

Get-ChildItem kan filtrera objekt med parametrarna Path, Filter, Include och Exclude , men de baseras vanligtvis bara på namn. Du kan utföra komplex filtrering baserat på andra egenskaper för objekt med hjälp Where-Objectav .

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 force-parametern:

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 inbyggda 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-växeln New-Item med kommandot för att skapa en mapp, och mappen redan finns, skrivs inte mappen över eller ersätts. 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 New-PSDrive kommandot . Följande kommando skapar en lokal enhet P: som är 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 är synlig från Utforskaren använder du parametern Spara. Det går dock bara att använda fjärrsökvägar med Spara.

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, som du ser här:

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ästs från filen som en matris med ett element per rad med filinnehåll. Du kan bekräfta detta genom att kontrollera längdendet 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 med 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.