Поскольку разделы реестра представляют собой элементы на дисках Windows PowerShell, работа с ними очень похожа на работу с файлами и папками. Одно важное различие заключается в том, что каждый элемент реестрового диска Windows PowerShell представляет собой контейнер, как и папка на диске файловой системы. Однако записи реестра и связанные с ними значения являются свойствами элементов, а не отдельными элементами.
Получение всех подразделов раздела реестра
Показать все элементы, непосредственно содержащиеся в разделе реестра, можно при помощи командлета Get-ChildItem. Для отображения скрытых и системных элементов добавьте необязательный параметр Force. Например, эта команда отображает элементы, непосредственно расположенные на диске HKCU: Windows PowerShell, который соответствует кусту HKEY_CURRENT_USER:
PS> Get-ChildItem -Path hkcu:\ Hive: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER SKC VC Name Property --- -- ---- -------- 2 0 AppEvents {} 7 33 Console {ColorTable00, ColorTable01, ColorTab... 25 1 Control Panel {Opened} 0 5 Environment {APR_ICONV_PATH, INCLUDE, LIB, TEMP...} 1 7 Identities {Last Username, Last User ... 4 0 Keyboard Layout {} ...
Это разделы верхнего уровня, которые можно видеть под разделом 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 и команда ls оболочки UNIX. Для показа вложенных элементов необходимо указать параметр 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 -FilterScript {($_.SubKeyCount -le 1) -and ($_.ValueCount -eq 4) }
Копирование разделов
Копирование выполняется при помощи командлета Copy-Item. Следующая команда копирует раздел HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion и все его свойства в раздел HKCU:\, создавая новый подраздел с именем "CurrentVersion":
Copy-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion' -Destination hkcu:
Если рассмотреть этот новый раздел в редакторе реестра или при помощи командлета Get-ChildItem, видно, что в новом расположении отсутствуют копии подразделов содержавшихся в исходном разделе. Чтобы копировать все содержимое контейнера, необходимо указать параметр Recurse. Копирование в предыдущем примере можно сделать рекурсивным, если использовать следующую команду:
Copy-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion' -Destination hkcu: -Recurse
Можно использовать и другие доступные средства для копирования файловой системы. В оболочке Windows PowerShell можно по-прежнему использовать любые средства для редактирования реестра (в том числе reg.exe, regini.exe и regedit.exe), а также COM-объекты, поддерживающие редактирование реестра (такие как WScript.Shell и WMI-класс StdRegProv).
Создание разделов
Создание новых разделов в реестре проще, чем создание нового элемента в файловой системе. Поскольку все разделы реестра являются контейнерами, нет необходимости указывать тип элемента. Достаточно указать точный путь, например:
New-Item -Path hkcu:\software\_DeleteMe
Для указания раздела можно также использовать путь на основе имени поставщика:
New-Item -Path Registry::HKCU\_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, но не сам раздел, вместо этого введите следующую команду:
Remove-Item -Path HKCU:\CurrentVersion\* -Recurse