批处理反转文本行序后丢失CRLF,如何保留换行符?
解决批处理反转文本行序时丢失CRLF的问题
你的批处理脚本反转行序时丢失CRLF,核心问题是for /F默认会跳过空行,且无法直接保留原文件的所有换行结构。以下是两种修复方案,能完整保留原文件的CRLF(包括空行对应的换行):
基础修复版(适用于不含特殊字符的文本)
@echo off ren *.txt Original.txt setlocal EnableDelayedExpansion :: 初始化空的反转文件 type nul > Reversed.txt :: 用findstr给每行加行号,强制读取所有行(包括空行) for /F "tokens=1* delims=:" %%a in ('findstr /n "^" Original.txt') do ( :: 将当前行插入到临时文件开头,再替换目标文件 (echo(%%b&type Reversed.txt) > temp.txt move /Y temp.txt Reversed.txt > NUL ) endlocal
增强兼容版(支持含!等特殊字符的文本)
如果原文件包含!这类会被延迟扩展解析的字符,用下面的脚本避免内容损坏:
@echo off ren *.txt Original.txt setlocal DisableDelayedExpansion type nul > Reversed.txt :: 读取所有行(含空行) for /F "tokens=1* delims=:" %%a in ('findstr /n "^" Original.txt') do ( set "line=%%b" :: 临时开启延迟扩展输出内容 setlocal EnableDelayedExpansion (echo(!line!&type Reversed.txt) > temp.txt endlocal move /Y temp.txt Reversed.txt > NUL ) endlocal
原理说明
findstr /n "^"会给每一行(包括空行)添加行号前缀(如3:),让for /F能读取到所有行,不会跳过空行;tokens=1* delims=:将行号和原内容拆分,%%b就是原行的完整内容(空行则为空白);echo(%%b或echo(!line!会自动输出内容并追加CRLF,确保每行的换行符被保留;- 通过将当前行放在临时文件开头,再覆盖目标文件,实现行序反转。
内容的提问来源于stack exchange,提问作者Eta Beta
相关产品推荐
相关产品推荐

