【问题标题】:How to add a REG_NONE empty value using Batch?如何使用批处理添加 REG_NONE 空值?
【发布时间】:2014-10-14 09:20:09
【问题描述】:

此注册表脚本在 reg 编辑器中写入一个REG_NONE 空值(表示为二进制数据):

Windows Registry Editor Version 5.00

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

(上图中data-description的英文翻译为:“zero-length binary value”)

我需要在 Batch 中重现相同的内容(以改进 Reg2Bat 转换器),但是当我尝试这样做时:

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

它添加数据:

也许 reg.exe 命令与 REG_NONE 值类型不兼容? (命令帮助说它是一个受支持的值,但是......你看)

我怎样才能真正添加​​一个REG_NONE 空值?

【问题讨论】:

  • 在我看来,支持 REG_NONE 类型的 REG 的代码(错误)是一个设计错误,但添加了此类型的值00 00(终止 Unicode 字符串的 null)即使在命令行上未指定 /D "..."REG ADD "HKCU\Key Name" /V "Value Name" /T REG_NONE /F 应该可以完成这项工作,但绝对不能,这可以解释为值得向 Microsoft 报告的 REG 错误。
  • @Mofi 感谢您的评论,我在 Windows XP 中测试了相同的命令,结果值是相同的空字符串:'00 00',你知道报告可能错误的链接吗微软?
  • 报告 Windows 及其安装工具中的错误非常困难,因为它可以在 Where can I report a bug in Windows 7?How to report a bug in Windows 7? 上阅读。除了通过电话联系 Microsoft 支持报告类似并希望微软支持人员也将其解释为要处理的问题。

标签: windows batch-file cmd registry registrykey


【解决方案1】:

到目前为止,我发现的唯一令人讨厌的选项是创建一个 .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 就像 WMI 提供程序上的那样只允许 SetBinaryValue 并且没有 SetNoneValue。除了 REG 之外,还有一个使用 wmic 的选项,它位于 WMI 提供程序上,但仍然不允许您创建 REG_NONE 类型(它确实使您能够创建零长度 REG_BINARY,REG 是也做不到)

你可以用这个命令得到最接近的empty二进制值(MC ND提供)

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

是一个两个零字节:00 00,由两个空字符终止(不提供选项/d)多字符串

【讨论】:

  • 虽然我不能不同意核心(解决问题的唯一方法是使用 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值的原因,一个双空终止的字符串。
  • 您可以像Rob van der Woude 发布的那样将 reg 文件嵌入批处理中。
  • @IrRelevant 这是一个有趣的技巧,但我认为它不能在这里应用,因为 reg 文件不是静态的。
【解决方案2】:

只是我基于 @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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    相关资源
    最近更新 更多