如何使用批处理添加一个REG_NONE空值?

6
这个注册表脚本在注册表编辑器中写入一个 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

它添加数据: enter image description here 也许reg.exe命令不兼容REG_NONE值类型?(命令帮助说它是一个支持的值,但是...你看)
我该如何真正添加一个REG_NONE空值?

1
在我看来,REG 支持类型 REG_NONE 是一个设计错误(bug),但即使在命令行上没有指定 /D "...",添加这种类型的值时会使用 00 00(Unicode 字符串的终止空字符)。REG ADD "HKCU\Key Name" /V "Value Name" /T REG_NONE /F 应该可以完成任务,但实际上并没有,这可能被解释为 REG 的 bug,值得向 Microsoft 报告。 - Mofi
@Mofi 感谢您的评论,我在Windows XP上测试了相同的命令,结果值是相同的空字符串:'00 00',您知道报告可能的错误给微软的链接吗? - ElektroStudios
1
在Windows及其安装工具中报告错误非常困难,如在哪里报告Windows 7的错误?如何报告Windows 7的错误?所述。除了通过电话联系Microsoft支持并希望Microsoft支持人员将其解释为问题以处理之外,几乎没有其他方法来报告此类问题。 - Mofi
2个回答

6

到目前为止,我找到的唯一可行的方法是创建一个 .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是一种特殊类型,由于实现细节(命令行工具针对String和multi string进行了优化),只能通过RegSetValueEx Windows API创建零长度二进制值。较高级别的API(如WMI提供程序上的API)仅允许使用SetBinaryValue,没有SetNoneValue选项。除了REG,还有一个使用wmic的选项,它更接近于WMI提供程序,但仍无法创建REG_NONE类型(它确实可以创建零长度REG_BINARY,REG也无法执行该操作)。

您可以使用此命令(由MC ND提供)获得最接近的空二进制值

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

这是由多个字符串(如果没有使用/d选项)的两个空字符终止符引起的,它们分别为两个零字节:00 00


虽然我不能反对核心观点(解决问题的唯一方法是使用reg文件),但说REG_NONE只能用RegSetValueEx创建是不正确的(OP使用reg.exe创建了它),而且说reg.exe无法创建空二进制值也是不正确的:reg add "hkcu\volatile environment" /v test /t reg_binaryreg.exe的问题在于当类型为reg_none时,它会读取命令行以检索reg_multi_sz值,这就是0x00 0x00值的原因,即双null终止字符串。 - MC ND
你可以像Rob van der Woude发布的那样,在批处理中嵌入reg文件。 - Ir Relevant
@IrRelevant 这是一个有趣的技巧,但我不认为它适用于这里,因为 reg 文件不是静态的。 - KennyBOT

1

这是基于@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)"

哦,还有各位不要忘记试用我的应用程序并向我报告错误(如果有的话):)

enter image description here

源代码(VB.NET):http://www.mediafire.com/download/1h3zbymfhnb3spt/REG2BAT.rar


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接