Работа с разделами реестра

Этот пример применяется только к платформам Windows.

Так как разделы реестра представляют собой элементы на дисках PowerShell, работа с ними очень похожа на работу с файлами и папками. Одно важное различие заключается в том, что каждый элемент реестрового диска PowerShell представляет собой контейнер, как и папка на диске файловой системы. Однако записи реестра и связанные с ними значения являются свойствами элементов, а не отдельными элементами.

Перечисление всех подразделов раздела реестра

Все элементы можно отобразить непосредственно в разделе реестра с помощью Get-ChildItem. Для отображения скрытых и системных элементов добавьте необязательный параметр Force. Например, эта команда отображает элементы, непосредственно расположенные на диске HKCU: PowerShell, который соответствует кусту реестра HKEY_CURRENT_USER:

Get-ChildItem -Path HKCU:\ | Select-Object Name
   Hive: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER

Name
----
HKEY_CURRENT_USER\AppEvents
HKEY_CURRENT_USER\Console
HKEY_CURRENT_USER\Control Panel
HKEY_CURRENT_USER\DirectShow
HKEY_CURRENT_USER\dummy
HKEY_CURRENT_USER\Environment
HKEY_CURRENT_USER\EUDC
HKEY_CURRENT_USER\Keyboard Layout
HKEY_CURRENT_USER\MediaFoundation
HKEY_CURRENT_USER\Microsoft
HKEY_CURRENT_USER\Network
HKEY_CURRENT_USER\Printers
HKEY_CURRENT_USER\Software
HKEY_CURRENT_USER\System
HKEY_CURRENT_USER\Uninstall
HKEY_CURRENT_USER\WXP
HKEY_CURRENT_USER\Volatile Environment

Это разделы верхнего уровня, отображаемые в разделе HKEY_CURRENT_USER в редакторе реестра (regedit.exe).

Указать этот путь в реестре можно также, задав имя поставщика реестра с последующей строкой ::. Полное имя поставщика реестра имеет вид Microsoft.PowerShell.Core\Registry, но может быть сокращено до Registry. Любая из следующих команд выводит содержимое элементов, непосредственно расположенных внутри HKCU:.

Get-ChildItem -Path Registry::HKEY_CURRENT_USER
Get-ChildItem -Path Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER
Get-ChildItem -Path Registry::HKCU
Get-ChildItem -Path Microsoft.PowerShell.Core\Registry::HKCU
Get-ChildItem HKCU:

Эти команды перечисляют только непосредственно содержащиеся элементы, как использование DIR в cmd.exe оболочке UNIX или ls в ней. Для показа вложенных элементов необходимо указать параметр Recurse. Для вывода всех разделов реестра в HKCU: используется приведенная ниже команда.

Get-ChildItem -Path HKCU:\ -Recurse

Командлет Get-ChildItem позволяет выполнять сложные операции фильтрации с помощью параметров Path, Filter, Include и Exclude, но обычно осуществляется лишь фильтрация по имени. Вы можете выполнять сложную фильтрацию на основе других свойств элементов с помощью командлета Where-Object . Следующая команда находит все разделы в HKCU:\Software, у которых не более одного подраздела и ровно четыре значения:

Get-ChildItem -Path HKCU:\Software -Recurse |
    Where-Object {($_.SubKeyCount -le 1) -and ($_.ValueCount -eq 4) }

Копирование ключей

Копирование выполняется с помощью командлета Copy-Item. Следующая команда копирует подраздел CurrentVersion из HKLM:\SOFTWARE\Microsoft\Windows\ и все его свойства в HKCU:\.

Copy-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion' -Destination HKCU:

Если вы изучите этот новый раздел в редакторе реестра или используете Get-ChildItem, обратите внимание, что в новом расположении нет копий содержащихся вложенных ключей. Чтобы скопировать все содержимое контейнера, необходимо указать параметр Recurse. Копирование в предыдущем примере можно сделать рекурсивным, если использовать следующую команду:

Copy-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion' -Destination HKCU: -Recurse

Для копирования файловой системы можно использовать и другие доступные средства. Любые средства редактирования реестра, включая , и COM-объекты, поддерживающие редактирование реестра, такие как reg.exeregedit.exeregini.exeWScript.Shell и класс StdRegProv WMI, можно использовать из PowerShell.

Создание ключей

Создание новых разделов в реестре проще, чем создание нового элемента в файловой системе. Так как все разделы реестра являются контейнерами, вам не нужно указывать тип элемента. Просто укажите явный путь, например:

New-Item -Path HKCU:\Software_DeleteMe

Для указания раздела можно также использовать путь на основе имени поставщика:

New-Item -Path Registry::HKCU\Software_DeleteMe

Удаление ключей

Удаление элементов в принципе осуществляется одинаково для всех поставщиков. Следующие команды автоматически удаляют элементы:

Remove-Item -Path HKCU:\Software_DeleteMe
Remove-Item -Path 'HKCU:\key with spaces in the name'

Удаление всех ключей под определенным ключом

Удалить вложенные элементы можно с помощью командлета Remove-Item, однако он потребует подтверждения удаления, если элемент сам что-нибудь содержит. Например, при попытке удаления созданного нами подраздела HKCU:\CurrentVersion будет отображено следующее:

Remove-Item -Path HKCU:\CurrentVersion
Confirm
The item at HKCU:\CurrentVersion\AdminDebug 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"):

Для удаления вложенных элементов без подтверждения следует указать параметр Recurse:

Remove-Item -Path HKCU:\CurrentVersion -Recurse

Если нужно удалить все элементы в HKCU:\CurrentVersion, но не сам раздел HKCU:\CurrentVersion, вместо этого введите следующее:

Remove-Item -Path HKCU:\CurrentVersion\* -Recurse