Работа с записями реестра
Этот пример применяется только к платформам Windows.
Так как записи реестра являются свойствами разделов, и, как это, нельзя напрямую просматривать, нам нужно сделать немного другой подход при работе с ними.
Перечисление записей реестра
Существует несколько способов просмотра реестра. Самый простой — получить имена свойств, связанные с разделом. Например, чтобы просмотреть имена записей в разделе реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
, используйте Get-Item
. Разделы реестра имеют свойство с универсальным именем "Свойство", который содержит список записей реестра в разделе. Следующая команда выбирает свойство Property и расширяет элементы, чтобы они отображались в списке:
Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion |
Select-Object -ExpandProperty Property
DevicePath
MediaPathUnexpanded
ProgramFilesDir
CommonFilesDir
ProductId
Чтобы просмотреть записи реестра в более удобочитаемой форме, используйте 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
Все свойства Windows PowerShell раздела имеют префиксы PS, например PSPath, PSParentPath, PSChildName и PSProvider.
Для создания ссылки на текущее расположение можно использовать нотацию *.*
. Set-Location
можно использовать для изменения значения на контейнер реестра CurrentVersion.
Set-Location -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
Кроме того, можно использовать встроенный HKLM:
PSDrive со Set-Location
следующими способами:
Set-Location -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion
Затем можно использовать нотацию .
для текущего расположения, чтобы перечислить свойства без указания полного пути.
Get-ItemProperty -Path .
...
DevicePath : C:\WINDOWS\inf
MediaPathUnexpanded : C:\WINDOWS\Media
ProgramFilesDir : C:\Program Files
...
Расширение пути работает так же, как и в файловой системе, поэтому из этого расположения можно получить список ItemProperty для HKLM:\SOFTWARE\Microsoft\Windows\Help
использования Get-ItemProperty -Path ..\Help
.
Получение одной записи реестра
Если необходимо получить конкретную запись в разделе реестра, можно использовать один из нескольких возможных подходов. Этот пример получает значение DevicePath в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
.
Вместе с Get-ItemProperty
используйте параметр Path, чтобы указать имя раздела и параметр Name, а также имя записи 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
Эта команда возвращает стандартные свойства Windows PowerShell, а также свойство DevicePath.
Примечание.
Хотя Get-ItemProperty
имеет параметры filter, Include и Exclude , они не могут использоваться для фильтрации по имени свойства. Эти параметры относятся в разделам реестра (путям элементов), а не к записям реестра (свойствам элементов).
Другим вариантом является использование средства командной reg.exe
строки. Для справки reg.exe
reg.exe /?
введите в командной строке. Чтобы найти запись DevicePath , используйте reg.exe
следующую команду:
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
Вы также можете использовать COM-объект WshShell для поиска некоторых записей реестра, хотя этот метод не работает с большими двоичными данными или именами записей реестра, включая символы обратной косой черты (\
). Добавьте имя свойства с разделителем "\
" в путь элемента:
(New-Object -ComObject WScript.Shell).RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DevicePath")
%SystemRoot%\inf
Настройка одной записи реестра
Если необходимо изменить определенную запись в разделе реестра, можно использовать один из нескольких подходов. Этот пример изменяет запись Path в разделе HKEY_CURRENT_USER\Environment
. Запись Path указывает расположение для поиска исполняемых файлов.
- Получите текущее значение записи Path с помощью
Get-ItemProperty
. - Добавьте новое значение, отделив его с помощью
;
. - Используйте
Set-ItemProperty
с указанным разделом, именем записи и значением, чтобы изменить запись реестра.
$value = Get-ItemProperty -Path HKCU:\Environment -Name Path
$newpath = $value.Path += ";C:\src\bin\"
Set-ItemProperty -Path HKCU:\Environment -Name Path -Value $newpath
Примечание.
Хотя Set-ItemProperty
имеет параметры filter, Include и Exclude , они не могут использоваться для фильтрации по имени свойства. Эти параметры относятся в разделам реестра (путям элементов), а не к записям реестра (свойствам элементов).
Другой вариант — использовать средство командной строки Reg.exe. Для получения справки по reg.exe введите reg.exe /?
в командной строке.
В следующем примере запись Path изменяется за счет удаления пути, добавленного в предыдущем примере.
Get-ItemProperty
по-прежнему используется для получения текущего значения, исключая анализ строки, возвращаемой reg query
. Методы SubString и LastIndexOf используются для получения последнего добавленного пути в запись Path.
$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.
Создание новых записей реестра
Чтобы добавить новую запись реестра с именем PowerShellPath в раздел CurrentVersion, используйтеNew-ItemProperty
с путем к разделу, именем записи и значением записи. В этом примере используется значение переменной Windows PowerShell $PSHome
, в которой хранится путь к каталогу установки Windows PowerShell.
Вы можете добавить новую запись в ключ с помощью следующей команды, а команда также возвращает сведения о новой записи:
$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
Значение PropertyType должно быть именем элемента перечисления Microsoft.Win32.RegistryValueKind из следующей таблицы:
String
— используется для значений REG_SZ.[System.String]
Передайте объект параметру Value.ExpandString
— используется для значений REG_EXPAND_SZ.[System.String]
Передайте объект параметру Value. Строка должна содержать необъяснимые ссылки на переменные среды, развернутые при извлечении значения.Binary
— используется для значений REG_BINARY.[System.Byte[]]
Передайте объект параметру Value.DWord
— используется для значений REG_DWORD.[System.Int32]
Передайте объект параметру Value.MultiString
— используется для значений REG_MULTI_SZ.[System.String[]]
Передайте объект параметру Value.QWord
— используется для значений REG_QWORD.[System.Int64]
Передайте объект параметру Value.
Запись реестра можно добавить в несколько расположений, указав массив значений для параметра Path:
$newItemPropertySplat = @{
Name = 'PowerShellPath'
PropertyType = 'String'
Value = $PSHome
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion',
'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion'
}
New-ItemProperty @newItemPropertySplat
Кроме того, можно перезаписать существующее значение записи реестра, добавив параметр Force в любую команду New-ItemProperty
.
В следующих примерах показано, как создать новые записи реестра различных типов. Значения реестра создаются в новом разделе с именем MySoftwareKey в разделе HKEY_CURRENT_USER\Software
. Переменная $key
используется для хранения нового ключевого объекта.
$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
Свойство PSPath ключевого объекта можно использовать в последующих командах.
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
Вы также можете передать $key
New-ItemProperty
значение для добавления значения в ключ.
$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
Отображение содержимого $key
отображает новые записи.
$key
Hive: HKEY_CURRENT_USER\Software
Name Property
---- --------
MySoftwareKey DefaultFolders : {Home, Temp, Publish}
MaxAllowed : 1024
BinaryDate : {51, 49, 45, 74…}
В следующем примере показан тип значения для каждой записи реестра:
$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…}
Переименование записей реестра
Чтобы переименовать запись PowerShellPath в PSHome, используйте Rename-ItemProperty
.
$renameItemPropertySplat = @{
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
Name = 'PowerShellPath'
NewName = 'PSHome'
}
Rename-ItemProperty @renameItemPropertySplat
Чтобы отобразить переименованное значение, добавьте параметр PassThru в команду.
$renameItemPropertySplat = @{
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
Name = 'PowerShellPath'
NewName = 'PSHome'
PassThru = $true
}
Rename-ItemProperty @renameItemPropertySplat
Удаление записей реестра
Чтобы удалить записи реестра PSHome и PowerShellPath, используйте Remove-ItemProperty
.
Remove-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PSHome
Remove-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath
PowerShell