#powershell #registry
#powershell #реестр
Вопрос:
Мне нужно импортировать reg-файл, содержащий стандартные параметры конфигурации для серверного продукта. Однако возможно, что одно окно Windows может содержать несколько экземпляров сервера. Каждый экземпляр сервера имеет свои собственные ключи конфигурации в реестре Windows.
Первый экземпляр будет иметь раздел реестра по умолчанию:
HKLMSOFTWARE<Vendor><Product>Settings
Любые другие экземпляры будут иметь разные имена, например:
HKLMSOFTWARE<Vendor><Product>Settings-foo
HKLMSOFTWARE<Vendor><Product>Settings-bar
HKLMSOFTWARE<Vendor><Product>Settings-baz
и т.д…
Файл реестра содержит настройки, которые необходимо применить к каждому из этих экземпляров сервера. Структура вложенных разделов реестра одинакова в каждом разделе. Итак, процесс развертывания вручную заключается в том, чтобы взять файл .reg и выполнить поиск и замену для "SOFTWARE<Vendor><Product>Settings"
файла и заменить его на "SOFTWARE<Vendor><Product>Settings-foo"
, затем импортировать недавно измененный файл .reg. Промыть и повторить для bar, baz и т.д.
Что я хочу сделать, так это написать сценарий PowerShell, который получает список всех ключей «Настройки» и выполняет эквивалентный поиск и замену перед импортом файла .reg. Я не нашел командлета, который может импортировать файлы .reg, поэтому, полагаю, мне нужно вызвать reg.exe или regedit.exe . Обе эти программы позволяют импортировать содержимое reg-файла, который находится на диске.
Мой вопрос в том, действительно ли мне нужно создавать файлы .reg и записывать их на диск, чтобы я мог затем вызвать reg.exe /Import <filename>
or regedit.exe /S <filename>
? Или есть какой-то способ, которым я могу просто загрузить исходный файл .reg, изменить его в памяти и получить reg.exe или regedit.exe как импортировать измененные разделы реестра без необходимости записи целого набора файлов .reg на диск?
Комментарии:
1. На самом деле это не ответ на ваш вопрос, но рассматривали ли вы возможность не использовать reg-файлы, а использовать сценарий powershell для изменения реестра?
2. Привет, Ларс. Есть несколько причин использовать reg-файлы: 1) Отделение логики скрипта от конфигурации (чтобы новая версия reg-файлов могла быть опубликована без необходимости изменять и переподписывать сценарии развертывания) 2) Не нужно изобретать велосипед, придумывая новый способ хранения сведений реестра, несовместимый с Regedit 3) Продолжаем поддерживать существующую инфраструктуру, основанную на reg-файлах. 4) Файлы .reg предоставляют механизм настройки для устаревших компьютеров без PowerShell, и я не хочу поддерживать два набора конфигурации.
Ответ №1:
Насколько я знаю, базовые командлеты PowerShell вообще не используют файл .reg.
Итак, с одной стороны, вы можете изменять свои reg-файлы и применять их с REG.EXE . С другой стороны, вы можете использовать командлеты поставщика реестра PowerShell ‘Item’ для изменения вашего реестра.
Ответ №2:
Вы могли бы создавать reg-команды в памяти и выполнять их, не прибегая к временным файлам. То есть создайте команды reg add следующим образом,
reg add \reg-path /v value-name /f /t type-name /d value-data
который добавит или перезапишет значение value-name на value-data в качестве данных в registry path reg-path.
Создание таких команд в цикле Powershell не должно быть слишком сложным.
Ответ №3:
Итак, вы можете сделать это двумя способами:
$Reg = get-itemproperty hkcu:environtmentpath #This will get all the keys in a path
$Reg.key1 = [int32]1
$Reg.key2 = [string]somevalue
set-item hkcu:environmentpath $Reg
или
$Reg = @"
Windows Registry Editor 5.00
[HKEY_CURRENT_USERenvironmentpath]
"key1"=dword:00000001
"key2"="somevalue"
"@
$reg | Out-file registry.reg
regedit /s registry.reg