Как мне добавить многострочную строку REG_SZ в реестр из командной строки?

StackOverflow https://stackoverflow.com/questions/153879

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top