错误记录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.每次运行这个脚本都要右击选择以管理员身份运行。