windows - CMD-批处理线长度。可以去除吗?如果没有,如何检查线路是否太长?

标签 windows batch-file cmd

对于 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 个字符)有关。如果我手动分割线,它会照常工作。

现在我正在寻找一种方法

  1. 使上面的代码适用于任何行长度或
  2. 插入对太长而无法处理的行的检查,以便批处理可以停止进程并显示适当的消息。

最佳答案

批处理文件中的长行问题是环境变量最多只能存储 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/

相关文章:

windows - 用于比较 2 个目录并获取不同文件名的批处理文件 [dos]

windows - 将多行批处理为一行?

java - 谁能解释 Windows (7 Pro N) 和 Linux ( Ubuntu 12-04) 之间的套接字吞吐量差异

windows - 将文件添加到 Windows 中的所有用户 'My Documents' 文件夹

batch-file - 可以搜索文件的 .bat 或 .wsh 脚本

batch-file - 批处理 - 动态标签或函数

c# - 通过命令行或 C# 创建 EF 模型

php - 不同的操作系统和服务器路径

windows - Inno Setup 忽略注册表重定向?

windows - 从 setlocal 代码中传递变量