【问题标题】:Loop through file - long line skipped循环文件 - 跳过长行
【发布时间】:2015-02-08 20:48:41
【问题描述】:

下面的循环/函数应该编辑一个文件(只是替换文件中的第二行)。 原始文件包含一个 > 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) 可以存储的最大长度有关。有没有办法避免这种行为?

提前致谢!

【问题讨论】:

  • one &gt; 165 000 signs long line 是什么意思?批量环境变量限制在8K左右
  • 文件中有一行165k长!

标签: file batch-file for-loop


【解决方案1】:

本机批处理无法处理超过 ~8191 字节的行,除非您采用一次读取一个字节的极端措施(它涉及创建长度 >= 源的虚拟文件,并使用 FC 导出字节)。这是我很少使用批处理来修改文件的众多原因之一。

我会用我的JREPL.BAT utility:

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

但还有很多其他选择。

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

或者您可以获得 sed、awk 或...的 Windows 端口。


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

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

  • 你不在乎制表符是否被转换成一串空格
  • 第一行长度为
  • 总行数
  • (可能还有一个我不记得的限制)
@echo off
setlocal enableDelayedExpansion
>"%~3" (
  set "ln="
  <"%~2" set /p "ln="
  echo(!ln!
  echo ^<html^>
  more +2 "%~2"
)

【讨论】:

  • 谢谢!那个 jrepl.bat 太棒了! o:虽然只有一个问题(因为我是批处理的初学者),我会去替换以下字符串吗? 它包含撇号,我没有找到逃避它们的方法......
  • @DragonGamer - 我认为你的意思是它包含双引号,而不是撇号。您可以使用\xnn 获取任何字节码,其中nn 是十六进制表示法。您必须添加 /X 选项才能在替换字符串中使用它。双引号的代码是\x22。或者,您可以使用\q,它始终需要/X 选项。阅读文档以获取有关 /X 选项的完整说明。
【解决方案2】:

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

@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 看到另一个示例。

【讨论】:

猜你喜欢
  • 2016-05-06
  • 2017-04-07
  • 2017-05-09
  • 2011-12-21
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
相关资源
最近更新 更多