前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【错误记录】Windows 系统 bat 脚本报错 ( Java 生成 bat 脚本乱码处理 | 输出 GB2312 字符串 | Windows 中的换行时 \r\n )

【错误记录】Windows 系统 bat 脚本报错 ( Java 生成 bat 脚本乱码处理 | 输出 GB2312 字符串 | Windows 中的换行时 \r\n )

作者头像
韩曙亮
发布2023-03-29 17:22:39
2.1K0
发布2023-03-29 17:22:39
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、报错信息


使用 Java 语言生成了 Windows 系统中的 bat 批处理脚本 , 运行后出现中文乱码 ;

使用如下 Java 代码生成 bat 脚本文件 ;

代码语言:javascript
复制
public class Main {

    public static void main(String[] args) throws Exception {
        File bat = new File("cmd.bat");

        FileWriter fileWriter = new FileWriter("cmd.bat");
        fileWriter.write("del delete_file.txt\n");
        fileWriter.write("del 待删除文件.txt\n");
        fileWriter.write("pause");
        fileWriter.close();
    }
}

生成内容如下 :

代码语言:javascript
复制
del delete_file.txt
del 待删除文件.txt
pause

执行该 bat 脚本出现如下问题 :

在这里插入图片描述
在这里插入图片描述

单独指令这两个命令 , 是可以执行成功的 ;

但是执行该批处理文件 , 出现乱码 ;

二、问题分析


打开该批处理文件 , 如果使用 UTF-8 编码打开 , 文件内容正常 ;

在这里插入图片描述
在这里插入图片描述

但是 bat 脚本是使用 ANSI 编码的 , 如果切换成 ANSI 编码 , 发现成乱码了 ;

在这里插入图片描述
在这里插入图片描述

这个乱码就是 bat 脚本执行的乱码 ;

在这里插入图片描述
在这里插入图片描述

修改程序后 , 以 GB2312 格式输出 , 使用 ANSI 编码打开 , 没有乱码 ;

在这里插入图片描述
在这里插入图片描述

执行时出现如下情况 , 还是乱码 ;

在这里插入图片描述
在这里插入图片描述

这就比较纠结 , 网上找的资料 , 显示只要是 ANSI 格式的 , 都可以执行 ;

这一次新创建一个 cmd1.bat 文件 , 并且使用记事本保存 , 另存为 ANSI 编码 , cmd1.bat 文件 ;

在这里插入图片描述
在这里插入图片描述

执行 cmd1.bat 脚本 , 居然没有乱码 ;

在这里插入图片描述
在这里插入图片描述

上二进制分析工具 , 分析这两个文件 ;

这是不可执行的 cmd.bat 的二进制数据 :

在这里插入图片描述
在这里插入图片描述

这是可执行的 cmd1.bat 的二进制数据 :

在这里插入图片描述
在这里插入图片描述

观察关键数据 , cmd1.bat 文件中 , 在 txt 后 , 多了一个字节 , 在 WIndows 系统中 , 换行时 \r\n , Java 程序中生成的是 \n 作为换行 , 这里特别注意 , 找了几个小时 ;

二、解决方案


上述 Java 程序出现

2

个问题 , 一个是 没有以 GB2312 格式输出 , 另一个是 WIndows 系统中的文本换行必须是 “\r\n” , 否则程序也无法执行 ;

修改后的程序 :

代码语言:javascript
复制
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

public class Main {

    public static void main(String[] args) throws Exception {
        File bat = new File("cmd.bat");

        OutputStreamWriter osw =new OutputStreamWriter((new FileOutputStream("cmd.bat")),"gb2312");
        osw.write("del delete_file.txt\r\n");
        osw.write("del 待删除文件.txt\r\n");
        osw.write("pause\n");
        osw.close();
    }
}

执行后 , 发现乱码问题解决 ;

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、报错信息
  • 二、问题分析
  • 二、解决方案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档