2015-02-08 38 views
1

下面的循环/功能应该编辑文件(只是替换第二行的文件中)。 原始文件包含一个> 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

你是什么意思由一个> 165000符号长线'?批量环境变量限制在8K左右 – Magoo 2015-02-08 20:54:17

+0

文件中有一行是165k长! – DragonGamer 2015-02-08 21:04:49

回答

2

本机批处理不能使用长度大于〜8191字节的行,除非您采取极端措施一次读取一个字节(它涉及创建长度大于等于源的虚拟文件并使用FC来导出字节)。这是我很少使用批处理来修改文件的原因之一。

我会用我的JREPL.BAT utility

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

但也有许多其他的选择。

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

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


更新 - 可能的纯料液

如果满足以下所有的有以下几种可能工作真:

  • 如果标签被转换成一个空格字符串,你不在乎
  • 第一行长度是< = 1021个字节,并且它不具有尾随控制字符
  • 线的总数是< 64K
  • (有可能是,我不能记住另一个限制)
@echo off 
setlocal enableDelayedExpansion 
>"%~3" (
    set "ln=" 
    <"%~2" set /p "ln=" 
    echo(!ln! 
    echo ^<html^> 
    more +2 "%~2" 
) 
+0

谢谢!那jrepl.bat真是太棒了! o: 虽然只有一个问题(因为我是一个批处理初学者),我会去替换下面的字符串吗? 它包含撇号我发现没有逃脱他们的方法... – DragonGamer 2015-02-09 00:51:56

+0

@DragonGamer - 我想你的意思是包含双引号,而不是单引号。你可以使用'\ xnn'来获取任何字节码,其中'nn'是十六进制符号。您必须添加'/ X'选项才能在替换字符串中使用它。双引号的代码是'\ x22'。或者,你可以使用'\ q',它总是需要'/ X'选项。阅读文档以获取对'/ X'选项的完整描述。 – dbenham 2015-02-09 01:12:03

+0

太棒了,就像计划一样工作!谢谢! – DragonGamer 2015-02-09 01:37:31

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

+0

有趣的方法,但不幸的是它说:FINDSTR:244行太长 :( – DragonGamer 2015-02-09 00:49:03

+0

是的,当使用重定向或管道输入FINDSTR有8191字节行长度限制。传递文件的名称时没有行长度限制(FINDSTR打开该文件),但在这种情况下无效。请参阅[Windows FINDSTR命令的未记录的功能和限制是什么?](http://stackoverflow.com/q/8844868/1012053)更多信息。 – dbenham 2015-02-09 01:38:59