Arbeta med registerposter

Eftersom registerposter är egenskaper för nycklar och därför inte kan bläddras direkt, måste vi använda en något annorlunda metod när vi arbetar med dem.

Lista registerposter

Det finns många olika sätt att undersöka registerposter. Det enklaste sättet är att hämta egenskapsnamnen som är associerade med en nyckel. Om du till exempel vill se namnen på posterna i registernyckeln HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion använder du Get-Item . Registernycklar har en egenskap med det allmänna namnet "Egenskap" som är en lista över registerposter i nyckeln. Följande kommando väljer egenskapen Egenskap och expanderar objekten så att de visas i en lista:

Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion |
  Select-Object -ExpandProperty Property
DevicePath
MediaPathUnexpanded
ProgramFilesDir
CommonFilesDir
ProductId

Om du vill visa registerposterna i ett mer läsbart format använder du Get-ItemProperty :

Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
PSPath              : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SO
                      FTWARE\Microsoft\Windows\CurrentVersion
PSParentPath        : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SO
                      FTWARE\Microsoft\Windows
PSChildName         : CurrentVersion
PSDrive             : HKLM
PSProvider          : Microsoft.PowerShell.Core\Registry
DevicePath          : C:\WINDOWS\inf
MediaPathUnexpanded : C:\WINDOWS\Media
ProgramFilesDir     : C:\Program Files
CommonFilesDir      : C:\Program Files\Common Files
ProductId           : 76487-338-1167776-22465
WallPaperDir        : C:\WINDOWS\Web\Wallpaper
MediaPath           : C:\WINDOWS\Media
ProgramFilesPath    : C:\Program Files
PF_AccessoriesName  : Accessories
(default)           :

De Windows PowerShell egenskaperna för nyckeln föregås av "PS", till exempel PSPath, PSParentPath, PSChildName och PSProvider.

Du kan använda *.* notationen för att referera till den aktuella platsen. Du kan använda Set-Location för att ändra till registercontainern CurrentVersion först:

Set-Location -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

Du kan också använda det inbyggda HKLM PSDrive med Set-Location :

Set-Location -Path hklm:\SOFTWARE\Microsoft\Windows\CurrentVersion

Du kan sedan använda *.* notationen för den aktuella platsen för att visa en lista över egenskaperna utan att ange en fullständig sökväg:

Get-ItemProperty -Path .
...
DevicePath          : C:\WINDOWS\inf
MediaPathUnexpanded : C:\WINDOWS\Media
ProgramFilesDir     : C:\Program Files
...

Sökvägsexpansion fungerar på samma sätt som i filsystemet, så från den här platsen kan du hämta ItemProperty-listan för HKLM:\SOFTWARE\Microsoft\Windows\Help med hjälp av Get-ItemProperty -Path ..\Help .

Hämta en enskild registerpost

Om du vill hämta en specifik post i en registernyckel kan du använda en av flera möjliga metoder. Det här exemplet hittar värdet för DevicePath i HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion .

Använd parametern Path för att ange namnet på nyckeln och parametern Name för att Get-ItemProperty ange namnet på Posten DevicePath.

Get-ItemProperty -Path HKLM:\Software\Microsoft\Windows\CurrentVersion -Name DevicePath
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\
               Microsoft\Windows\CurrentVersion
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\
               Microsoft\Windows
PSChildName  : CurrentVersion
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry
DevicePath   : C:\WINDOWS\inf

Det här kommandot returnerar Windows PowerShell standardegenskaperna samt devicepath-egenskapen.

Anteckning

Även Get-ItemProperty om har parametrarna Filter, Include och Exclude kan de inte användas för att filtrera efter egenskapsnamn. Dessa parametrar refererar till registernycklar, som är objektsökvägar och inte registerposter, som är objektegenskaper.

Ett annat alternativ är att Reg.exe kommandoradsverktyget. Om du behöver hjälp reg.exe skriver du reg.exe /? i en kommandotolk. Du hittar posten DevicePath genom att reg.exe som visas i följande kommando:

reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion /v DevicePath
! REG.EXE VERSION 3.0

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
    DevicePath  REG_EXPAND_SZ   %SystemRoot%\inf

Du kan också använda WshShell COM-objektet för att hitta vissa registerposter, även om den här metoden inte fungerar med stora binära data eller med registerinmatningsnamn som innehåller tecken som omsnedstreck ( \ ). Lägg till egenskapsnamnet i objektsökvägen med en \ avgränsare:

(New-Object -ComObject WScript.Shell).RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DevicePath")
%SystemRoot%\inf

Ange en enskild registerpost

Om du vill ändra en viss post i en registernyckel kan du använda en av flera möjliga metoder. I det här exemplet ändras posten Sökväg under HKEY_CURRENT_USER\Environment . Posten Sökväg anger var körbara filer ska sökas.

  1. Hämta det aktuella värdet för posten Sökväg med hjälp av Get-ItemProperty .
  2. Lägg till det nya värdet och avgränsa det med ; en .
  3. Använd Set-ItemProperty med den angivna nyckeln, postnamnet och värdet för att ändra registerposten.
$value = Get-ItemProperty -Path HKCU:\Environment -Name Path
$newpath = $value.Path += ";C:\src\bin\"
Set-ItemProperty -Path HKCU:\Environment -Name Path -Value $newpath

Anteckning

Även Set-ItemProperty om har parametrarna Filter, Include och Exclude kan de inte användas för att filtrera efter egenskapsnamn. Dessa parametrar refererar till registernycklar, som är objektsökvägar och inte registerposter, som är objektegenskaper.

Ett annat alternativ är att Reg.exe kommandoradsverktyget. Om du behöver hjälp reg.exe skriver dureg.exe /? i en kommandotolk.

I följande exempel ändras posten Sökväg genom att ta bort sökvägen som lades till i exemplet ovan. Get-ItemProperty används fortfarande för att hämta det aktuella värdet för att undvika att behöva parsa strängen som returneras från reg query . Metoderna SubString och LastIndexOf används för att hämta den sista sökvägen som lagts till i posten Sökväg.

$value = Get-ItemProperty -Path HKCU:\Environment -Name Path
$newpath = $value.Path.SubString(0, $value.Path.LastIndexOf(';'))
reg add HKCU\Environment /v Path /d $newpath /f
The operation completed successfully.

Skapa nya registerposter

Om du vill lägga till en ny post med namnet "PowerShellPath" i CurrentVersion-nyckeln använder du med sökvägen till nyckeln, postnamnet och värdet New-ItemProperty för posten. I det här exemplet tar vi värdet för variabeln Windows PowerShell , som lagrar sökvägen till $PSHome installationskatalogen för Windows PowerShell.

Du kan lägga till den nya posten i nyckeln med hjälp av följande kommando, så returnerar kommandot även information om den nya posten:

New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath -PropertyType String -Value $PSHome
PSPath         : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
PSParentPath   : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
PSChildName    : CurrentVersion
PSDrive        : HKLM
PSProvider     : Microsoft.PowerShell.Core\Registry
PowerShellPath : C:\Program Files\Windows PowerShell\v1.0

PropertyType måste vara namnet på en Microsoft.Win32.RegistryValueKind-uppräkningsmedlem från följande tabell:

PropertyType-värde Innebörd
Binär Binära data
Dword Ett tal som är en giltig UInt32
ExpandString En sträng som kan innehålla miljövariabler som expanderas dynamiskt
MultiString En flerradssträng
Sträng Val annat strängvärde
QWord 8 byte binära data

Anteckning

Du kan lägga till en registerpost på flera platser genom att ange en matris med värden för parametern Path:

New-ItemProperty -Name PowerShellPath -PropertyType String -Value $PSHome `
  -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion, HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion

Du kan också skriva över ett befintligt registerpostvärde genom att lägga till parametern Force till val annat New-ItemProperty kommando.

Byta namn på registerposter

Om du vill byta namn på PowerShellPath-posten till "PSHome" använder du Rename-ItemProperty :

Rename-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath -NewName PSHome

Om du vill visa det omdöpta värdet lägger du till parametern PassThru i kommandot.

Rename-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath -NewName PSHome -passthru

Ta bort registerposter

Om du vill ta bort både PSHome- och PowerShellPath-registerposterna använder du Remove-ItemProperty :

Remove-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PSHome
Remove-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath