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-Object
av .
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ängden på 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 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.