String 从文本文件中删除二进制控制字符

String 从文本文件中删除二进制控制字符,string,windows,batch-file,control-characters,String,Windows,Batch File,Control Characters,我有一个包含二进制控制字符的文本文件,如“^@”和“^M”。当我试图直接对文本文件执行字符串操作时,控制字符会使脚本崩溃 通过反复试验,我发现more命令将剥离控制字符,以便我可以正确处理文件 more file_with_control_characters.not_txt > file_without_control_characters.txt 这是一种好方法,还是有更好的方法从文本文件中删除控制字符?在早于Windows 8的操作系统中,是否有更多的具有这种行为?当然,您不想简单

我有一个包含二进制控制字符的文本文件,如“^@”和“^M”。当我试图直接对文本文件执行字符串操作时,控制字符会使脚本崩溃

通过反复试验,我发现
more
命令将剥离控制字符,以便我可以正确处理文件

more file_with_control_characters.not_txt > file_without_control_characters.txt

这是一种好方法,还是有更好的方法从文本文件中删除控制字符?在早于Windows 8的操作系统中,是否有更多的具有这种行为?

当然,您不想简单地删除所有控制字符。换行符和制表符也是控制字符,您不想删除它们

我假设您的
^m
是回车,而
^@
是空字节。回车不会给您带来问题,更多的回车不会消除这些问题。但是,如果实用程序需要ASCII文本文件,空字节可能会导致问题

您的输入文件很可能是UTF-16。更多的是将UTF-16转换为ANSI(扩展ASCII)格式,这样可以有效地删除空字节。它还将非ASCII值转换为十进制128-255字节值范围内的扩展ASCII字符。我相信它使用了您的活动代码页(CHCP)值来确定哪些字符映射到哪里,但我不是肯定的

您应该注意一些其他问题

  • “更多”将所有制表符转换为一系列空格,并且您无法控制空格的数量(取决于行中的当前位置)

  • “更多”将始终以\r\n(回车和换行)终止每一行

  • “更多”还会删除文件开头的双字节BOM表(如果存在)。BOM表示UTF-16格式。但MORE不需要2字节BOM指示符,它会将UTF-16转换为ANSI

  • 最后,如果您的文件超过64K行,更多的文件可能会无限期挂起

如果更多的东西对你有用,那就用它吧

另一个选项是使用TYPE,它还将UTF-16转换为ANSI:

type "yourFile.txt" >"newFile.txt"
类型根据活动代码页映射非ASCII代码

类型转换的方式与其他方式有一些不同

  • 类型的一个优点是它不会将制表符转换为空格

  • 另一个优点是它不会挂起大文件

  • 另一个区别(可能是好的,也可能是坏的)是,它不会向尚未添加行终止符的行添加行终止符

  • 该类型的一个潜在缺点是,如果输入缺少BOM,它将无法将UTF-16转换为ANSI


CMD/Win8中没有命令来执行您试图执行的操作(听起来像是从二进制文件中过滤出非字母数字字节)。。。旁注:你们最好能找到你们想要浏览的文件格式的阅读器……请阅读并发布一个问题,这样我们可以帮助你们。我正在报告一个有效的方法。我正在使用批处理与具有有限文件输出选项的并发运行的.exe进行通信。我的问题是-此方法是否适用于早期/晚期windows操作系统(Win98等)?我只见过当你
ftp
一个文本文件而忘记使用
asc
模式时,控制字符被添加到这样的文本文件中。谢谢你给出了这个非常详细、有用的答案!我的输入文件是非常专业和定义良好的格式(我实际上是从另一个并发可执行文件上运行的脚本生成此文件),因此我可以小心避免您记录的更多潜在问题。如果我遇到了这些问题之一,我现在知道类型可能是一个改进的选项。再次感谢您抽出时间仔细回答这个问题。