2015-02-08 53 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