Arbeta med filer och mappar
Att navigera Windows PowerShell enheter och manipulera objekten på dem liknar manipulering av filer och mappar på Windows fysiska diskenheter. Den här artikeln beskriver hur du hanterar specifika fil- och mappmanipuleringsuppgifter 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 Windows PowerShell enhet C (som är samma som Windows fysiska enhet C):
Get-ChildItem -Path C:\ -Force
Kommandot visar bara de direkt inneslutna objekten, ungefär som att Cmd.exe använda kommandot eller i UNIX DIR ls gränssnitt. Om du vill visa inneslutna objekt måste du även -Recurse ange parametern . (Det kan ta mycket lång tid att slutföra.) Så här listar du allt på C-enheten:
Get-ChildItem -Path C:\ -Force -Recurse
Get-ChildItemkan filtrera objekt med parametrarna Sökväg, Filter, Inkludera och Exkludera, men de 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 görs med Copy-Item . Följande kommando backar upp C: \boot.ini till C: \ boot.bak:
Copy-Item -Path C:\boot.ini -Destination C:\boot.bak
Om målfilen redan finns misslyckas kopieringsförsöket. Om du vill skriva över ett befintligt mål använder du force-parametern:
Copy-Item -Path C:\boot.ini -Destination C:\boot.bak -Force
Det här kommandot fungerar även när målet är skrivskyddade.
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 som finns var som helst C:\data i till C:\temp\text :
Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text
Du kan fortfarande använda andra verktyg för att utföra filsystemkopior. XCOPY-, ROBOCOPY- och COM-objekt, till exempel Scripting.FileSystemObject, fungerar i Windows PowerShell. Du kan till exempel använda com-Windows Scripting.FileSystem COM-klassen för att C:\boot.ini backa upp till C:\boot.bak :
(New-Object -ComObject Scripting.FileSystemObject).CopyFile('C:\boot.ini', 'C:\boot.bak')
Skapa filer och mappar
Att skapa nya objekt fungerar på samma sätt på alla Windows PowerShell leverantörer. Om en Windows PowerShell-provider har mer än en typ av objekt– till exempel, skiljer FileSystem Windows PowerShell-providern mellan kataloger och filer – måste du ange objekttypen.
Det här kommandot skapar en ny C:\temp\New Folder mapp:
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 växeln Tvinga med kommandot för att skapa en mapp och mappen redan finns, kommer den inte att skriva över New-Item eller ersätta mappen. Det returnerar bara det befintliga mappobjektet. Men om du använder New-Item -Force på en fil som redan finns skrivs filen över helt.
Ta bort alla filer och mappar i en mapp
Du kan ta bort inneslutna Remove-Item objekt med , men du uppmanas att bekräfta borttagningen om objektet innehåller något annat. Om du till exempel försöker ta bort mappen som innehåller andra objekt Windows PowerShell du om bekräftelse innan C:\temp\DeleteMe du tar bort mappen:
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"):
Om du inte vill uppmanas att ange 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 som P: är rotad i den lokala Program Files-katalogen, som endast visas från PowerShell-sessionen:
New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem
Precis som med nätverksenheter är enheter som mappas i Windows PowerShell omedelbart synliga för Windows PowerShell gränssnittet. Parametern behövs för att skapa en mappad enhet Utforskaren från -Persist en mappad enhet. Men endast fjärrsökvägar kan användas 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. Get-ContentCmdleten kan användas för att läsa en hel fil i ett steg, som du ser här:
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 behandlar redan 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 C:\boot.ini).Length
6
Det här kommandot är mest användbart för att hämta listor med information till Windows PowerShell direkt. Du kan till exempel lagra en lista med datornamn eller IP-adresser i en fil , med C:\temp\domainMembers.txt 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.