这是一个简单的 unix2dos.bat 文件,它保留了空行和感叹号:
@echo off
setlocal DisableDelayedExpansion
for /f "tokens=1,* delims=:" %%k in ('findstr /n "^" %1') do echo.%%l
输出到标准输出,因此如果需要,将 unix2dos.bat 输出重定向到文件。
它通过以下方式避免了其他先前为 /f 批处理循环解决方案提出的陷阱:
1) 使用延迟扩展关闭,以避免吃掉感叹号。
2) 使用 for /f 标记器本身从findstr /n
输出行中删除行号。
(使用 findstr /n 也需要获取空行:如果 for /f 直接从输入文件中读取,它们将被删除。)
但是,正如 Jeb 在下面的评论中指出的那样,上述解决方案有一个其他解决方案没有的缺点:它在行首删除了冒号。
所以 2020-04-06 更新只是为了好玩,这是另一个基于 findstr.exe 的 1-liner,它似乎可以正常工作而没有上述缺点:
@echo off
setlocal DisableDelayedExpansion
for /f "tokens=* delims=0123456789" %%l in ('findstr /n "^" %1') do echo%%l
其他技巧是:
3) 使用数字 0-9 作为分隔符,以便tokens=*
跳过初始行号。
4) 使用findstr /n
在行号后插入的冒号作为 echo 命令后的标记分隔符。
我会留给 Jeb 来解释是否存在echo:something
可能失败的极端情况 :-)
我只能说最后一个版本成功地恢复了我庞大的批处理库上的行尾,所以异常(如果有的话)一定非常罕见!