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

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了错误记录Windows 系统 bat 脚本报错 ( Java 生成 bat 脚本乱码处理 | 输出 GB2312 字符串 | Windows 中的换行时 )相关的知识,希望对你有一定的参考价值。





一、报错信息



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

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

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();
    }
}

生成内容如下 :

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

修改后的程序 :

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();
    }
}

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

以上是关于错误记录Windows 系统 bat 脚本报错 ( Java 生成 bat 脚本乱码处理 | 输出 GB2312 字符串 | Windows 中的换行时 )的主要内容,如果未能解决你的问题,请参考以下文章

Win平台阅读Kafka源码时候使用bat脚本时候报错以及解决方案

写了一个bat脚本,用来启动windows服务,系统是windows7.每次运行这个脚本都要右击选择以管理员身份运行。

windows下bat脚本记录

WINDOWS程序监控及故障自动重启思路及bat脚本实现

Windows Server 批量创建DNS区域及记录(使用bat脚本)

如何启动startMysql.bat