В рамках настройки сборки на машине с 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.
В примере используется ключ Environment, потому что это удобно, а не потому, что особенно полезно добавлять такие данные в переменные среды. Можно использовать RegEdit, чтобы убедиться, что импортированные данные REG_SZ содержат символы CRLF.
Спасибо за новый ответ. Я попробую это сделать в следующий раз, когда у меня возникнет аналогичная проблема.
Это выглядит ужасно, логично и в то же время выполнимо.
Идея vbscript решила мою проблему. Механизм сценариев является стандартным для платформы Windows XP, на которой мне нужно работать. Чтобы добавить новые строки (0x0a) в сценарии vbscripts, я использовал & vbLf