循环文件 - 跳过长行

时间:2015-02-08 20:48:41

标签: file batch-file for-loop

以下循环/函数应该编辑文件(只需替换文件中的第二行)。 原始文件包含一个> 165000签署长行,执行此循环后,此行只是在新文件中消失。

setlocal EnableDelayedExpansion
set /a count=0
>"%~3" (
  for /f "usebackq delims=" %%A in ("%~2") do  (
    if !count!==1 (echo ^<html^>) else (
      setlocal DisableDelayedExpansion
      echo.%%A
      endlocal)
    set /a count+=1
  )
)
endlocal
goto:eof

我认为它与变量(%% A)可以存储的最大长度有关..有没有办法避免这种行为?

提前致谢!

2 个答案:

答案 0 :(得分:2)

原生批处理无法使用长度大于〜8191字节的行,除非您采用一次读取一个字节的极端措施(它涉及创建长度为&gt; =源的虚拟文件,并使用FC来派生字节)。这是我很少使用批量修改文件的众多原因之一。

我会使用我的JREPL.BAT utility

call jrepl "^.*" "<html>" /jbegln "skip=(ln!=2)" /f "%~2" /o "%~3" 

但还有很多其他选择。

您可以使用JScript或VBS编写自定义代码,通过CSCRIPT执行。或者您可以使用PowerShell。

或者你可以获得一个Windows端口sed,或awk,或者......


更新 - 可能的纯批处理解决方案

如果满足以下所有条件,则以下内容可能有效:

  • 您不关心标签是否转换为空格字符串
  • 第一行长度为&lt; = 1021字节,并且没有尾随控制字符
  • 总行数<64k
  • (可能还有另一个我不记得的限制)
@echo off
setlocal enableDelayedExpansion
>"%~3" (
  set "ln="
  <"%~2" set /p "ln="
  echo(!ln!
  echo ^<html^>
  more +2 "%~2"
)

答案 1 :(得分:1)

如果文件中的第一行和第二行的大小小于1 KB,那么下面的纯批处理文件可以解决您的问题:

@echo off
setlocal EnableDelayedExpansion

< "%~2" (

   rem Read the first line from redirected Stdin and copy it to Stdout
   set /P "line="
   echo !line!

   rem Read the second line and replace it by another one
   set /P "line="
   echo ^<html^>

   rem Copy the rest of lines to Stdout
   findstr "^"

) > "%~3"

有关此方法的进一步说明,请参阅this post;您还可以在this one看到另一个示例。