Импортировать измененные скриптом файлы .reg с помощью PowerShell?

#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