Manipulera objekt direkt

De element som du ser i PowerShell-enheter, till exempel filer och mappar eller registernycklar, kallas Objekt i PowerShell. Cmdletarna för att arbeta med objektet har substantivet Objekt i deras namn.

Utdata från kommandot Get-Command -Noun Item 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 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 katalogen C:\Temp 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 katalogen New.Directory 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 objekt egenskaper.) 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, kommer du endast att se undernyckeln OptionalComponents i 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ägsnotationen skiljer inte mellan registerundernyckeln med namnet 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å filen file1.txt till fileOne.txt.

Rename-Item -Path C:\temp\New.Directory\file1.txt fileOne.txt

Cmdleten Rename-Item kan ändra namnet på en fil eller mapp, men det går inte att flytta ett objekt. Följande kommando misslyckas eftersom det försöker flytta filen från katalogen New.Directory 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 katalogen New.Directory från katalogen C:\temp till rotmappen på C:-enheten. Om du vill kontrollera att objektet har flyttats inkluderar du parametern PassThru i cmdleten Move-Item. Utan PassThruvisar Move-Item-cmdleten 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

Kopiering av objekt

Om du är bekant med kopieringsåtgärderna i andra skal, kan du tycka att beteendet hos Copy-Item cmdleten i PowerShell är ovanligt. När du kopierar ett objekt från en plats till en annan kopierar Copy-Item inte innehållet som standard.

Om du till exempel kopierar katalogen New.Directory från C:-enheten till katalogen C:\temp 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.Directoryser du att det inte innehåller några filer:

PS> Get-ChildItem -Path C:\temp\New.Directory
PS>

Varför kopierar inte cmdleten Copy-Item innehållet till den nya platsen?

Cmdleten Copy-Item har utformats för att vara generisk; Det ä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 inkluderar du 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 Remove-Item, som kan göra betydande, oåterkalleliga ändringar uppmanar ofta till bekräftelse när du anger dess kommandon. Om du till exempel försöker ta bort mappen New.Directory 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

Utfö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å mappen C:\Windows.

Om du anropar Boot.ini-filen på ett system före Windows Vista:

Invoke-Item C:\boot.ini

Om den .ini filtypen är associerad med Anteckningar öppnas boot.ini-filen i Anteckningar.