Как мне добавить многострочную строку REG_SZ в реестр из командной строки?
-
03-07-2019 - |
Вопрос
Как часть настройки сборки на компьютере с Windows, мне нужно добавить запись в реестре, и я хотел бы сделать это из простого пакетного файла.
Запись предназначена для стороннего приложения, поэтому формат фиксирован.
Запись принимает форму строки REG_SZ, но должна содержать новые строки, т.е.Символы 0xOA в качестве разделителей.
Я столкнулся с несколькими проблемами.
При первой попытке был использован regedit для загрузки сгенерированного reg-файла.Это не удалось, так как ему, похоже, не нравились ни длинные строки, ни строки с переводом строк.Я обнаружил, что экспорт работает нормально, импорт завершается с ошибкой.Я смог протестировать экспорт, поскольку стороннее приложение добавляет подобные записи непосредственно через win32 api.
Во второй попытке использовалась команда REG ADD, но я все равно не могу найти способ добавления символов новой строки, все, что я пытаюсь, заканчивается добавлением буквенной строки.
Решение
Вы могли бы создать файл VBScript (.vbs) и просто вызвать его из пакетного файла, предполагая, что вы выполняете другие действия в пакете, отличные от этого изменения реестра.В vbscript вы бы смотрели на что-то вроде:
set WSHShell = CreateObject("WScript.Shell")
WSHShell.RegWrite "HKEY_LOCAL_MACHINE\SOMEKEY", "value", "type"
Вы должны быть в состоянии найти возможные значения типа с помощью Google.
Другие советы
Если вы не ограничены языком сценариев, вы можете сделать это на C # с помощью
Registry.CurrentUser.OpenSubKey(@"software\classes\something", true).SetValue("some key", "sometext\nothertext", RegistryValueKind.String);
Вы можете импортировать многострочные строки REG_SZ, содержащие разрывы возврата каретки (CR) и перевода строки (LF) в конце строки (EOL), в реестр, используя reg-файлы, если вы не возражаете против перевода текста в шестнадцатеричную кодировку UTF-16LE.Чтобы импортировать REG_SZ с этим текстом:
1st Line 2nd Line
Вы могли бы создать файл с именем MULTILINETEXT.REG, который содержит это:
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Environment] "MULTILINETEXT"=hex(1):31,00,73,00,74,00,20,00,4c,00,69,00,6e,00,65,00,0d,00,0a,00,\ 32,00,6e,00,64,00,20,00,4c,00,69,00,6e,00,65,00,0d,00,0a,00,\ 00,00
Чтобы закодировать ASCII в UTF-16LE, просто добавьте нулевой байт после каждого значения ASCII-кода.Значения REG_SZ должны заканчиваться нулевым символом (,00,00
) в нотации UTF-16LE.
Импортируйте изменения реестра в пакетный файл REG.EXE IMPORT MULTILINETEXT.REG
.
В примере используется ключ окружения, потому что это удобно, а не потому, что особенно полезно добавлять такие данные в переменные окружения.Можно использовать RegEdit для проверки того, что импортированные данные REG_SZ содержат символы CRLF.