当前位置: 首页 > 知识库问答 >
问题:

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

靳富
2024-08-23
# 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个答案

柴衡
2024-08-23
  1. bat文件使用GBK编码保存
  2. 执行reg add前先执行chcp 65001 > nul
  3. 执行完reg add后,需要执行chcp 936 > nul
  4. 使用\r\n换行
孔建柏
2024-08-23

在批处理(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时隐藏其启动信息。
  • 如果你的环境策略或安全设置阻止了直接运行脚本,你可能需要调整策略或使用管理员权限来运行批处理文件。
  • 在某些情况下,注册表项的权限设置可能阻止写入操作,确保你有足够的权限来修改注册表。
 类似资料:
  • 注册表是Windows系统的关键要素之一。 它包含有关操作系统各个方面的大量信息。 几乎所有安装在Windows系统上的应用程序都以某种形式与注册表交互。 注册表包含两个基本元素:键和值。 注册表项是与文件夹类似的容器对象。 注册表值是与文件类似的非容器对象。键可能包含值或其他键。 使用类似于Windows路径名称的语法来引用键,并使用反斜杠来指示层次结构的级别。 本章介绍查询值,添加,删除和编辑

  • 我正在创建一个c项目,它应该可以在几个时区工作。应用程序接收到一个带有参考时区的事件,该事件在用户所在的本地时区的正确时间以图形方式显示给用户。例如,一个在柏林工作的用户收到一个在东京编写的事件。来自东京的事件首先转换为UTC时间,然后再从UTC转换为柏林的计算机本地时间,最后显示在用户的图形界面上。 要将UTC时间转换为本地计算机时间,我可以使用Windows API的几个功能来完成这项工作。但

  • 方式1:在脚本编辑器里一句一句地写,需要熟悉注册表相关知识和NSIS脚本语法。 如 ;关闭XP文件保护 WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" "SFCDisable" 0xffffff9d ;开放匿名方式获取本机信息 WriteRegDWORD HKLM "SYSTEM\Current

  • 问题内容: 使用Java读/写Windows注册表 问题答案: 我知道这个问题很旧,但这是Google上第一个”java read/write to registry”的搜索结果。最近,我发现了这段惊人的代码: 可以读/写注册表的任何部分。 不使用JNI。 请勿使用任何第三方/外部应用程序进行工作。 不直接使用WINDOWS API 这是纯Java代码。 通过实际访问类中的私有方法,它使用反射来工

  • 问题内容: 使用Java读/写Windows注册表? 问题答案: Java Native Access(JNA)是用于处理本机库的出色项目,并且通过Advapi32Util和Advapi32支持平台库(platform.jar)中的Windows注册表。

  • 我目前正在尝试用Kotlin为Android编写一个注释处理器。项目结构如下: 项目/构建.gradle 注释/build.gradle 样品/build.gradle Annotation.kt AnnotationProcessor.kt 使用kapt,构建在示例javaPreCompileDebug上中断,并显示以下消息: 当我用注释处理器替换 kapt 时,构建在示例:转换类上中断了以下消

  • 我有一个Spring批处理应用程序,它从mysql数据库读取数据,并将其写入csv文件。 问题:当我看到csv中的数据时,我面临的问题是,一些大的数字显示为指数值。例如,对于这个数字“4491611100277480”,它显示为“4.49161E 15” 下面是我正在使用的代码片段

  • 我们正在使用Cassandra 2.0.10和CassandraC驱动程序1.0.0beta4 WARN[本机传输请求: 83088] 2015-01-08 22:56:15,327BatchStatement.java(第226行)[clipmine_prod.tag_attributes,clipmine_prod.tag]的一批准备好的语句大小为5812,超过5120的指定阈值692。 这意