以下循环/函数应该编辑文件(只需替换文件中的第二行)。 原始文件包含一个> 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)可以存储的最大长度有关..有没有办法避免这种行为?
提前致谢!
答案 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,或者......
更新 - 可能的纯批处理解决方案
如果满足以下所有条件,则以下内容可能有效:
@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"