对于 cmd 批处理脚本来说还是新手...
我有一个批处理可以从文件中删除制表符。这通常与以下代码配合使用效果很好:
setlocal DisableDelayedExpansion
for /f "delims=" %%A in ('"findstr /n ^^ %FILENAME%"') do (
set "line=%%A"
setlocal EnableDelayedExpansion
set "line=!line:*:=!"
if defined line (
set "line=!line: =!"
(echo(!line!)>>%TEMPFILE%
) ELSE echo(
endlocal
)
但是最近它不是简单地删除制表符,而是整行!我发现这一定与该行的异常长度(> 9500 个字符)有关。如果我手动分割线,它会照常工作。
现在我正在寻找一种方法
- 使上面的代码适用于任何行长度或
- 插入对太长而无法处理的行的检查,以便批处理可以停止进程并显示适当的消息。
最佳答案
批处理文件中的长行问题是环境变量最多只能存储 8 KB。但是,可以以较小的 block 处理较长的行,因为当 set /P
命令读取一长行,最多读取 1022 个字符,其余字符将由 下一个 set /P
读取命令。下面的批处理文件使用此方法(与 findstr /O "^"
结合使用,可以了解行的长度)复制具有无限大小行的文件:
@echo off
setlocal EnableDelayedExpansion
set "last=1022"
< input.txt (
for /F "delims=:" %%a in ('findstr /O "^" input.txt') do (
set /A "len=%%a-last-2, last=%%a, chunks=(len-1)/1022+1"
set "chunk="
for /L %%i in (1,1,!chunks!) do (
set /P "chunk="
set /P "=!chunk!" < NUL
)
if !chunks! gtr 0 echo/
)
for %%a in (input.txt) do set /A "len=%%~Za-last-2, chunks=(len-1)/1022+1"
set "chunk="
for /L %%i in (1,1,!chunks!) do (
set /P "chunk="
set /P "=!chunk!" < NUL
)
echo/
) > output.txt
move /Y output.txt input.txt
此方法要求输入行以 CR+LF 字符结尾(Windows 标准),并且存在 set /P
固有的问题:它可以从行尾或每个 1022 个字符 block 的末尾消除控制字符,或从行/ block 的开头消除空格;更多详情请访问this post 。您可以修改此程序更改 set /P "=!chunk!" < NUL
通过相应的set /P "=!chunk: =!" < NUL
一个是为了消除制表符。
关于windows - CMD-批处理线长度。可以去除吗?如果没有,如何检查线路是否太长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30183812/