Manipulera objekt direkt
De element som visas i PowerShell-enheter, till exempel filer och mappar eller registernycklar, kallas objekt i PowerShell. Cmdletarna för att arbeta med objektet har substantivobjektet i sina namn.
Utdata från Get-Command -Noun Item
kommandot visar att det finns nio PowerShell-objekt-cmdletar.
Get-Command -Noun Item
CommandType Name Definition
----------- ---- ----------
Cmdlet Clear-Item Clear-Item [-Path] <String[]...
Cmdlet Copy-Item Copy-Item [-Path] <String[]>...
Cmdlet Get-Item Get-Item [-Path] <String[]> ...
Cmdlet Invoke-Item Invoke-Item [-Path] <String[...
Cmdlet Move-Item Move-Item [-Path] <String[]>...
Cmdlet New-Item New-Item [-Path] <String[]> ...
Cmdlet Remove-Item Remove-Item [-Path] <String[...
Cmdlet Rename-Item Rename-Item [-Path] <String>...
Cmdlet Set-Item Set-Item [-Path] <String[]> ...
Skapa nya objekt
Om du vill skapa ett nytt objekt i filsystemet använder du cmdleten New-Item
. Inkludera parametern Path (Sökväg ) med sökvägen till objektet och parametern ItemType med värdet file
eller directory
.
Om du till exempel vill skapa en ny katalog med namnet New.Directory
i C:\Temp
katalogen skriver du:
New-Item -Path c:\temp\New.Directory -ItemType Directory
Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2006-05-18 11:29 AM New.Directory
Om du vill skapa en fil ändrar du värdet för parametern ItemType till file
. Om du till exempel vill skapa en fil med namnet file1.txt
i New.Directory
katalogen skriver du:
New-Item -Path C:\temp\New.Directory\file1.txt -ItemType file
Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp\New.Directory
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2006-05-18 11:44 AM 0 file1
Du kan använda samma teknik för att skapa en ny registernyckel. Det är faktiskt enklare att skapa en registernyckel eftersom den enda objekttypen i Windows-registret är en nyckel. (Registerposter är objektegenskaper.) Om du till exempel vill skapa en nyckel med namnet _Test
i undernyckeln CurrentVersion
skriver du:
New-Item -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\_Test
Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
SKC VC Name Property
--- -- ---- --------
0 0 _Test {}
När du skriver en registersökväg måste du inkludera kolonet (:
) i PowerShell-enhetsnamnen HKLM:
och HKCU:
. Utan kolonet känner PowerShell inte igen enhetsnamnet i sökvägen.
Varför registervärden inte är objekt
När du använder cmdleten Get-ChildItem
för att hitta objekten i en registernyckel visas aldrig faktiska registerposter eller deras värden.
Registernyckeln HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
innehåller till exempel vanligtvis flera registerposter som representerar program som körs när systemet startas.
Men när du använder Get-ChildItem
för att leta efter underordnade objekt i nyckeln ser OptionalComponents
du bara undernyckeln för nyckeln:
Get-ChildItem HKLM:\Software\Microsoft\Windows\CurrentVersion\Run
Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
SKC VC Name Property
--- -- ---- --------
3 0 OptionalComponents {}
Även om det vore praktiskt att behandla registerposter som objekt kan du inte ange en sökväg till en registerpost på ett sätt som säkerställer att den är unik. Sökvägs notationen skiljer inte mellan registerundernyckeln kör och registerposten (standard) i undernyckeln Kör.
Eftersom registerpostnamn kan innehålla omvänt snedstreck (\
), om registerposter var objekt, kan du inte använda sökvägsanteckningen för att skilja en registerpost med namnet Windows\CurrentVersion\Run
från undernyckeln som finns i sökvägen.
Byta namn på befintliga objekt
Om du vill ändra namnet på en fil eller mapp använder du cmdleten Rename-Item
. Följande kommando ändrar namnet på file1.txt
filen till fileOne.txt
.
Rename-Item -Path C:\temp\New.Directory\file1.txt fileOne.txt
Cmdleten Rename-Item
kan ändra namnet på en fil eller en mapp, men det kan inte flytta ett objekt. Följande kommando misslyckas eftersom det försöker flytta filen från New.Directory
katalogen till temp-katalogen.
Rename-Item -Path C:\temp\New.Directory\fileOne.txt c:\temp\fileOne.txt
Rename-Item : can't rename because the target specified isn't a path.
At line:1 char:12
+ Rename-Item <<<< -Path C:\temp\New.Directory\fileOne c:\temp\fileOne.txt
Flytta objekt
Om du vill flytta en fil eller mapp använder du cmdleten Move-Item
.
Följande kommando flyttar till exempel katalogen New.Directory från C:\temp
katalogen till enhetens C:
rot. Om du vill kontrollera att objektet har flyttats tar du med parametern PassThru för cmdleten Move-Item
. Utan PassThru visar cmdleten Move-Item
inga resultat.
Move-Item -Path C:\temp\New.Directory -Destination C:\ -PassThru
Directory: Microsoft.PowerShell.Core\FileSystem::C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2006-05-18 12:14 PM New.Directory
Kopiera objekt
Om du är bekant med kopieringsåtgärderna i andra gränssnitt kan cmdletens Copy-Item
beteende i PowerShell vara ovanligt. När du kopierar ett objekt från en plats till en annan Copy-Item
kopieras inte innehållet som standard.
Om du till exempel kopierar New.Directory
katalogen från C:-enheten till C:\temp
katalogen lyckas kommandot, men filerna i katalogen New.Directory kopieras inte.
Copy-Item -Path C:\New.Directory -Destination C:\temp
Om du visar innehållet i C:\temp\New.Directory
ser du att det inte innehåller några filer:
PS> Get-ChildItem -Path C:\temp\New.Directory
PS>
Varför kopierar inte Copy-Item
cmdleten innehållet till den nya platsen?
Cmdleten har utformats för att vara allmän. Det Copy-Item
är inte bara för att kopiera filer och mappar.
Även när du kopierar filer och mappar kanske du bara vill kopiera containern och inte objekten i den.
Om du vill kopiera allt innehåll i en mapp tar du med parametern Recurse för cmdleten Copy-Item
i kommandot . Om du redan har kopierat katalogen utan dess innehåll lägger du till parametern Force , som gör att du kan skriva över den tomma mappen.
Copy-Item -Path C:\New.Directory -Destination C:\temp -Recurse -Force -PassThru
Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2006-05-18 1:53 PM New.Directory
Directory: Microsoft.PowerShell.Core\FileSystem::C:\temp\New.Directory
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2006-05-18 11:44 AM 0 file1
Ta bort objekt
Om du vill ta bort filer och mappar använder du cmdleten Remove-Item
. PowerShell-cmdletar, till exempel , som Remove-Item
kan göra betydande, oåterkalleliga ändringar uppmanas ofta att bekräftas när du anger dess kommandon. Om du till exempel försöker ta bort New.Directory
mappen uppmanas du att bekräfta kommandot eftersom mappen innehåller filer:
Remove-Item C:\temp\New.Directory
Confirm
The item at C:\temp\New.Directory 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"):
Eftersom Yes
är standardsvaret trycker du på Retur för att ta bort mappen och dess filer. Om du vill ta bort mappen utan att bekräfta använder du parametern Recurse .
Remove-Item C:\temp\New.Directory -Recurse
Köra objekt
PowerShell använder cmdleten Invoke-Item
för att utföra en standardåtgärd för en fil eller mapp. Den här standardåtgärden bestäms av standardprogramhanteraren i registret. effekten är densamma som om du dubbelklickar på objektet i Utforskaren.
Anta till exempel att du kör följande kommando:
Invoke-Item C:\WINDOWS
Ett Explorer-fönster som finns i C:\Windows
visas, precis som om du hade dubbelklickat på C:\Windows
mappen.
Om du anropar Boot.ini
filen på ett system före Windows Vista:
Invoke-Item C:\boot.ini
.ini
Om filtypen är associerad med Anteckningar boot.ini
öppnas filen i Anteckningar.