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

Этот скрипт реестра записывает REG_NONE пустое значение в редактор регистров (которое представлено в виде двоичных данных):

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\keyname]
"valuename"=hex(0):

введите здесь описание изображения

(английский перевод описания данных на изображении выше: "бинарное значение нулевой длины")

Мне нужно воспроизвести то же самое в пакетном режиме (чтобы улучшить конвертер Reg2Bat), но когда я пытаюсь это сделать:

REG ADD "HKCU\keyname" /V "valuename" /T "REG_NONE" /D "" /F

Он добавляет данные:

введите здесь описание изображения

Может быть, команда reg.exe несовместима с типом значения REG_NONE? (помощь по команде говорит, что это поддерживаемое значение, но... понимаете)

Как я мог действительно добавить REG_NONE пустое значение?


person ElektroStudios    schedule 20.08.2014    source источник
comment
На мой взгляд, это ошибка дизайна в коде (ошибка) REG для поддержки типа REG_NONE, но добавление значения этого типа с 00 00 (завершающий нуль строки Unicode ) даже если /D "..." не указан в командной строке. REG ADD "HKCU\Key Name" /V "Value Name" /T REG_NONE /F должен выполнять свою работу, но определенно не делает этого, что может быть истолковано как ошибка REG, о которой следует сообщить в Microsoft.   -  person Mofi    schedule 24.08.2014
comment
@Mofi спасибо за комментарий, я протестировал ту же команду в Windows XP, и в результате получилось то же самое значение null: «00 00», знаете ли вы ссылку, чтобы сообщить о возможной ошибке в Microsoft?   -  person ElektroStudios    schedule 25.08.2014
comment
Сообщать об ошибках в Windows и ее установленных инструментах очень сложно, так как это можно прочитать на Где я могу сообщить об ошибке в Windows 7? и Как сообщить об ошибке в Windows 7? Есть еще или нет другого способа, кроме как связаться со службой поддержки Microsoft по телефону, чтобы сообщить о подобных вещах и надеяться, что сотрудник службы поддержки Microsoft интерпретирует это также как проблему для обработки.   -  person Mofi    schedule 25.08.2014


Ответы (2)


Единственный неприятный вариант, который я нашел до сих пор, — это создать файл .reg и импортировать его:

call :regnone HKEY_CURRENT_USER "keyname" valuename

goto :eof

:regnone
rem create a reg file
echo Windows Registry Editor Version 5.00 > none.reg
echo [%~1\%~2] >> none.reg
echo "%~3"=hex(0): >> none.reg

rem import it the registry
reg import none.reg 

del /q none.reg    

goto :eof

REG_NONE — это особый тип, который из-за деталей реализации (инструменты командной строки оптимизированы для строк и нескольких строк) может быть создан только с двоичным значением нулевой длины с помощью RegSetValueEx Windows API. API более высокого уровня, такие как API-интерфейс поставщика WMI, допускают только SetBinaryValue и нет SetNoneValue. Помимо REG, есть также возможность использовать wmic, который находится немного ближе к провайдеру WMI, но по-прежнему не позволяет вам создавать тип REG_NONE (он позволяет вам создавать REG_BINARY нулевой длины, чего REG также не может делать)

Ближайшее пустое двоичное значение, которое можно получить с помощью этой команды (предоставлено MC ND)

reg add "hkcu\volatile environment" /v test /t reg_binary

представляет собой два нулевых байта: 00 00, вызванных завершением двух нулевых символов из (не предусмотренной опцией /d ) multi String

person KennyBOT    schedule 24.08.2014
comment
Хотя я не могу не согласиться с ядром (единственный способ решить проблему - использовать reg-файл), неправильно говорить, что REG_NONE может быть создан только с помощью RegSetValueEx (ОП создал его с помощью reg.exe), и это неправильно говорить, что reg.exe не может создать пустое двоичное значение: reg add "hkcu\volatile environment" /v test /t reg_binary. Проблема с reg.exe заключается в том, что когда тип reg_none, он считывает командную строку для получения значения reg_multi_sz, причины значения 0x00 0x00, строки с двойным нулем в конце. - person MC ND; 25.08.2014
comment
Вы можете встроить reg-файл в пакет примерно так, как опубликовал Роб ван дер Вауде. - person Ir Relevant; 25.08.2014
comment
@IrRelevant Это интересный трюк, но я не думаю, что его можно применить здесь, потому что reg-файл не статичен. - person KennyBOT; 25.08.2014

Просто мое расширенное решение, основанное на ответе @KennyBOT:

:Add_Special_Value :: Support for adding an special registry value type.

Set "KeyRoot=%~1"
Set "KeyName=%~2"
Set "ValueName=%~3"
Set "ValueType=%~4"
Set "ValueData=%~5"

Set "RegFile=%TEMP%\%ValueType%.reg"

If /I "%KeyRoot%" EQU "HKCR" (Set "KeyRoot=HKEY_CLASSES_ROOT")
If /I "%KeyRoot%" EQU "HKCU" (Set "KeyRoot=HKEY_CURRENT_USER")
If /I "%KeyRoot%" EQU "HKLM" (Set "KeyRoot=HKEY_LOCAL_MACHINE")
If /I "%KeyRoot%" EQU "HKCC" (Set "KeyRoot=HKEY_CURRENT_CONFIG")
If /I "%KeyRoot%" EQU  "HKU" (Set "KeyRoot=HKEY_USERS")

If /I "%ValueType%" EQU "REG_NONE"                       (Set "ValueType=hex^(0^)")
If /I "%ValueType%" EQU "REG_RESOURCE_LIST"              (Set "ValueType=hex^(8^)")
If /I "%ValueType%" EQU "REG_RESOURCE_REQUIREMENTS_LIST" (Set "ValueType=hex^(a^)")
If /I "%ValueType%" EQU "REG_FULL_RESOURCE_DESCRIPTOR"   (Set "ValueType=hex^(9^)")

(
 Echo Windows Registry Editor Version 5.00
 Echo [%KeyRoot%\%KeyName%]
 Echo "%ValueName%"=%ValueType%:%ValueData%
)>"%RegFile%"

REG.exe "Import" "%RegFile%"
DEL     /Q       "%RegFile%" 2>NUL
Goto :EOF

Использование:

Call :Add_Special_Value "HKCU" "MyKeyName" "MyValueName" "REG_NONE" "Binary data (If any)"

О, и, ребята, не забудьте попробовать мое приложение и сообщить мне об ошибках (если они есть) :)

введите здесь описание изображения

ИСХОДНЫЙ КОД (VB.NET): http://www.mediafire.com/download/1h3zbymfhnb3spt/REG2BAT.rar

person ElektroStudios    schedule 25.08.2014