Udostępnij za pośrednictwem


Praca z wpisami rejestru

Ten przykład dotyczy tylko platform systemu Windows.

Ponieważ wpisy rejestru są właściwościami kluczy, a w związku z tym nie można ich przeglądać bezpośrednio, musimy wykonać nieco inne podejście podczas pracy z nimi.

Wyświetlanie listy wpisów rejestru

Istnieje wiele różnych sposobów badania wpisów rejestru. Najprostszym sposobem jest pobranie nazw właściwości skojarzonych z kluczem. Aby na przykład wyświetlić nazwy wpisów w kluczu HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersionrejestru , użyj polecenia Get-Item. Klucze rejestru mają właściwość o ogólnej nazwie "Właściwość", która jest listą wpisów rejestru w kluczu. Następujące polecenie wybiera właściwość Property i rozwija elementy, aby były wyświetlane na liście:

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

Aby wyświetlić wpisy rejestru w bardziej czytelnym formularzu, użyj polecenia Get-ItemProperty:

Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
ProgramFilesDir          : C:\Program Files
CommonFilesDir           : C:\Program Files\Common Files
ProgramFilesDir (x86)    : C:\Program Files (x86)
CommonFilesDir (x86)     : C:\Program Files (x86)\Common Files
CommonW6432Dir           : C:\Program Files\Common Files
DevicePath               : C:\WINDOWS\inf
MediaPathUnexpanded      : C:\WINDOWS\Media
ProgramFilesPath         : C:\Program Files
ProgramW6432Dir          : C:\Program Files
SM_ConfigureProgramsName : Set Program Access and Defaults
SM_GamesName             : Games
PSPath                   : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWA
                           RE\Microsoft\Windows\CurrentVersion
PSParentPath             : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWA
                           RE\Microsoft\Windows
PSChildName              : CurrentVersion
PSDrive                  : HKLM
PSProvider               : Microsoft.PowerShell.Core\Registry

Właściwości związane z programem Windows PowerShell dla klucza są poprzedzone ciągiem "PS", takimi jak PSPath, PSParentPath, PSChildName i PSProvider.

Możesz użyć *.* notacji do odwoływania się do bieżącej lokalizacji. Aby najpierw zmienić kontener rejestru CurrentVersion, możesz użyć Set-Location polecenia :

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

Alternatywnie możesz użyć wbudowanej HKLM: usługi PSDrive z usługą Set-Location:

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

Następnie możesz użyć . notacji dla bieżącej lokalizacji, aby wyświetlić listę właściwości bez określania pełnej ścieżki:

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

Rozszerzenie ścieżki działa tak samo jak w systemie plików, więc z tej lokalizacji można uzyskać listę ItemProperty na HKLM:\SOFTWARE\Microsoft\Windows\Help potrzeby używania polecenia Get-ItemProperty -Path ..\Help.

Pobieranie pojedynczego wpisu rejestru

Jeśli chcesz pobrać określony wpis w kluczu rejestru, możesz użyć jednego z kilku możliwych metod. W tym przykładzie znajduje wartość parametru DevicePath w pliku HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion.

Za pomocą Get-ItemPropertypolecenia użyj parametru Ścieżka , aby określić nazwę klucza i parametr Name , aby określić nazwę wpisu DevicePath .

Get-ItemProperty -Path HKLM:\Software\Microsoft\Windows\CurrentVersion -Name DevicePath
DevicePath   : C:\WINDOWS\inf
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

To polecenie zwraca standardowe właściwości programu Windows PowerShell, a także właściwość DevicePath .

Uwaga

Mimo że Get-ItemProperty ma parametry Filter, Include i Exclude , nie mogą być używane do filtrowania według nazwy właściwości. Te parametry odnoszą się do kluczy rejestru, które są ścieżkami elementów, a nie wpisami rejestru, które są właściwościami elementu.

Inną opcją reg.exe jest użycie narzędzia wiersza polecenia. Aby uzyskać pomoc dotyczącą reg.exepolecenia , wpisz reg.exe /? polecenie w wierszu polecenia. Aby znaleźć wpis DevicePath , użyj polecenia reg.exe , jak pokazano w poniższym poleceniu:

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

Można również użyć obiektu COM programu WshShell , aby znaleźć niektóre wpisy rejestru, chociaż ta metoda nie działa z dużymi danymi binarnymi lub z nazwami wpisów rejestru, które zawierają znaki, takie jak ukośnik odwrotny (\). Dołącz nazwę właściwości do ścieżki elementu z separatorem \ :

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

Ustawianie pojedynczego wpisu rejestru

Jeśli chcesz zmienić określony wpis w kluczu rejestru, możesz użyć jednego z kilku możliwych metod. W tym przykładzie zmodyfikowano wpis Ścieżka w obszarze HKEY_CURRENT_USER\Environment. Wpis Ścieżka określa, gdzie można znaleźć pliki wykonywalne.

  1. Pobierz bieżącą wartość wpisu Ścieżka przy użyciu polecenia Get-ItemProperty.
  2. Dodaj nową wartość, oddzielając ją elementem ;.
  3. Użyj Set-ItemProperty polecenia z określonym kluczem, nazwą wpisu i wartością, aby zmodyfikować wpis rejestru.
$value = Get-ItemProperty -Path HKCU:\Environment -Name Path
$newpath = $value.Path += ";C:\src\bin\"
Set-ItemProperty -Path HKCU:\Environment -Name Path -Value $newpath

Uwaga

Mimo że Set-ItemProperty ma parametry Filter, Include i Exclude , nie mogą być używane do filtrowania według nazwy właściwości. Te parametry odnoszą się do kluczy rejestru — które są ścieżkami elementów , a nie wpisami rejestru — które są właściwościami elementu.

Inną opcją jest użycie narzędzia wiersza polecenia Reg.exe. Aby uzyskać pomoc dotyczącą reg.exe, wpisz reg.exe /? w wierszu polecenia.

Poniższy przykład zmienia wpis Ścieżka , usuwając ścieżkę dodaną w powyższym przykładzie. Get-ItemProperty Jest nadal używany do pobierania bieżącej wartości, aby uniknąć konieczności analizowania ciągu zwróconego z reg query. Metody SubString i LastIndexOf są używane do pobierania ostatniej ścieżki dodanej do wpisu Ścieżka .

$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.

Tworzenie nowych wpisów rejestru

Aby dodać nowy wpis o nazwie "PowerShellPath" do klucza CurrentVersion , użyj z New-ItemProperty ścieżką do klucza, nazwą wpisu i wartością wpisu. W tym przykładzie użyjemy wartości zmiennej $PSHomeprogramu Windows PowerShell, która przechowuje ścieżkę do katalogu instalacyjnego programu Windows PowerShell.

Nowy wpis można dodać do klucza przy użyciu następującego polecenia, a polecenie zwraca również informacje o nowym wpisie:

$newItemPropertySplat = @{
    Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
    Name = 'PowerShellPath'
    PropertyType = 'String'
    Value = $PSHome
}
New-ItemProperty @newItemPropertySplat
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

Właściwość PropertyType musi być nazwą elementu członkowskiego wyliczenia Microsoft.Win32.RegistryValueKind z poniższej tabeli:

  • String — służy do REG_SZ wartości. [System.String] Przekaż obiekt do parametru Value.
  • ExpandString — służy do REG_EXPAND_SZ wartości. [System.String] Przekaż obiekt do parametru Value. Ciąg powinien zawierać niezrozpaczone odwołania do zmiennych środowiskowych, które są rozwinięte po pobraniu wartości.
  • Binary — służy do REG_BINARY wartości. [System.Byte[]] Przekaż obiekt do parametru Value.
  • DWord — służy do REG_DWORD wartości. [System.Int32] Przekaż obiekt do parametru Value.
  • MultiString — służy do REG_MULTI_SZ wartości. [System.String[]] Przekaż obiekt do parametru Value.
  • QWord — służy do REG_QWORD wartości. [System.Int64] Przekaż obiekt do parametru Value.

Wpis rejestru można dodać do wielu lokalizacji, określając tablicę wartości parametru Path :

$newItemPropertySplat = @{
    Name = 'PowerShellPath'
    PropertyType = 'String'
    Value = $PSHome
    Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion',
           'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion'
}
New-ItemProperty @newItemPropertySplat

Możesz również zastąpić wstępnie istniejącą wartość wpisu rejestru, dodając parametr Force do dowolnego New-ItemProperty polecenia.

W poniższych przykładach pokazano, jak utworzyć nowe wpisy rejestru różnych typów. Wartości rejestru są tworzone w nowym kluczu o nazwie MySoftwareKey w obszarze HKEY_CURRENT_USER\Software. Zmienna $key jest używana do przechowywania nowego obiektu klucza.

$key = New-Item -Path HKCU:\Software -Name MySoftwareKey
$newItemPropertySplat = @{
    Path = $key.PSPath
    Name = 'DefaultFolders'
    PropertyType = 'MultiString'
    Value = 'Home', 'Temp', 'Publish'
}
New-ItemProperty @newItemPropertySplat
DefaultFolders : {Home, Temp, Publish}
PSPath         : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MySoftwareKey
PSParentPath   : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software
PSChildName    : MySoftwareKey
PSProvider     : Microsoft.PowerShell.Core\Registry

Można użyć właściwości PSPath obiektu klucza w kolejnych poleceniach.

New-ItemProperty -Path $key.PSPath -Name MaxAllowed -PropertyType QWord -Value 1024
MaxAllowed   : 1024
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MySoftwareKey
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software
PSChildName  : MySoftwareKey
PSProvider   : Microsoft.PowerShell.Core\Registry

Możesz również przekazać potok $key , aby New-ItemProperty dodać wartość do klucza.

$date = Get-Date -Format 'dd-MMM-yyyy'
$newItemPropertySplat = @{
    Name = 'BinaryDate'
    PropertyType = 'Binary'
    Value = ([System.Text.Encoding]::UTF8.GetBytes($date))
}
$key | New-ItemProperty @newItemPropertySplat
BinaryDate   : {51, 49, 45, 74…}
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MySoftwareKey
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software
PSChildName  : MySoftwareKey
PSProvider   : Microsoft.PowerShell.Core\Registry

Wyświetlanie zawartości pokaże $key nowe wpisy.

$key
    Hive: HKEY_CURRENT_USER\Software

Name                           Property
----                           --------
MySoftwareKey                  DefaultFolders : {Home, Temp, Publish}
                               MaxAllowed     : 1024
                               BinaryDate     : {51, 49, 45, 74…}

W poniższym przykładzie przedstawiono typ wartości dla każdego rodzaju wpisu rejestru:

$key.GetValueNames() | Select-Object @{n='ValueName';e={$_}},
     @{n='ValueKind';e={$key.GetValueKind($_)}},
     @{n='Type';e={$key.GetValue($_).GetType()}},
     @{n='Value';e={$key.GetValue($_)}}
ValueName        ValueKind Type            Value
---------        --------- ----            -----
DefaultFolders MultiString System.String[] {Home, Temp, Publish}
MaxAllowed           QWord System.Int64    1024
BinaryDate          Binary System.Byte[]   {51, 49, 45, 74…}

Zmienianie nazw wpisów rejestru

Aby zmienić nazwę wpisu programu PowerShellPath na "PSHome", użyj polecenia Rename-ItemProperty:

$renameItemPropertySplat = @{
    Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
    Name = 'PowerShellPath'
    NewName = 'PSHome'
}
Rename-ItemProperty @renameItemPropertySplat

Aby wyświetlić zmienioną nazwę wartości, dodaj parametr PassThru do polecenia .

$renameItemPropertySplat = @{
    Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
    Name = 'PowerShellPath'
    NewName = 'PSHome'
    PassThru = $true
}
Rename-ItemProperty @renameItemPropertySplat

Usuwanie wpisów rejestru

Aby usunąć wpisy rejestru PSHome i PowerShellPath, użyj polecenia Remove-ItemProperty:

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