批处理中修改注册表,中文写入后会变成乱码?

# test.bat

reg add "HKEY_CLASSES_ROOT\CLSID\{xxxxx-xxxx-xxxx-xxxx-xxxx}" /ve /t REG_SZ /d "中文" /f

image.png

网上说的修改批处理文件的编码为ANSI,只能解决批处理打印为中文的问题,但是写入到注册表就无效了

chcp语法会导致第三行的reg命令被吞掉,见红线处:
image.png

阅读 2.9k
avatarAI BotBETA

在批处理(Batch)文件中直接写入包含中文的注册表项时,确实可能会遇到乱码问题,这主要是因为批处理文件本身对字符编码的支持有限。尽管将批处理文件的编码改为ANSI可以在某些情况下解决显示中文的问题,但在写入注册表时,这种改变并不总是有效。

为了解决这个问题,你可以使用Windows Script Host(WSH)的JScript或VBScript来辅助你的批处理文件,因为这两种脚本语言对Unicode字符的支持更好。以下是一个使用JScript的示例,该脚本可以在批处理文件中调用,以写入包含中文的注册表项:

  1. 创建一个JS文件(如WriteRegValue.js
// WriteRegValue.js
var WshShell = WScript.CreateObject("WScript.Shell");
var keyPath = "HKEY_CLASSES_ROOT\\CLSID\\{xxxxx-xxxx-xxxx-xxxx-xxxx}";
var valueName = ""; // 空字符串表示默认(无名称)值
var valueData = "中文";

WshShell.RegWrite(keyPath + "\\" + valueName, valueData, "REG_SZ");
  1. 在批处理文件中调用该JS文件
@echo off
cscript //nologo WriteRegValue.js
echo 已写入注册表项。
pause

这种方法通过使用JScript来执行注册表操作,可以有效地绕过批处理文件在字符编码上的限制。

注意:

  • 确保将{xxxxx-xxxx-xxxx-xxxx-xxxx}替换为你实际的CLSID。
  • 脚本中的//nologo参数用于在调用cscript时隐藏其启动信息。
  • 如果你的环境策略或安全设置阻止了直接运行脚本,你可能需要调整策略或使用管理员权限来运行批处理文件。
  • 在某些情况下,注册表项的权限设置可能阻止写入操作,确保你有足够的权限来修改注册表。
1 个回答
  1. bat文件使用GBK编码保存
  2. 执行reg add前先执行chcp 65001 > nul
  3. 执行完reg add后,需要执行chcp 936 > nul
  4. 使用\r\n换行
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Microsoft
子站问答
访问
宣传栏