2017-10-16 80 views
2
@echo off 
cls 
Color 0A 

:Read 
setlocal EnableDelayedExpansion 
set file=WinSCP-5.11.2-ReadMe.txt 
call :ReadInLines 
call :EchoLines 

echo insert other code here 
pause 
endlocal 
(goto) 2>nul 

:ReadInLines 
set Counter=0 
for /f "DELIMS=" %%i in ('type %file%') do (
    set /a Counter+=1 
    title Lines In File: !Counter! 
    set "Line_!Counter!=%%i" 
) 
(goto) 2>nul 

:EchoLines 
For /L %%C in (1,1,%Counter%) Do (echo %%C. !Line_%%C!) 
pause 

所以這是我此刻的需要從線在批處理文件中讀取到B線

它能夠成功地讀取並輸入該文件的整個代碼,但我想在工作不需要滾動(更大的文件)

基本上我需要能夠做的方法是閱讀一定量線

例如:

讀1-8行也讀5至13行

基本上我需要能夠互換它讀取到的數字,一個標籤,以便調優選

完成代碼:

call.bat:

@echo off 
cls 
Color 0A 

:: double call 
call text-read-lines-alt.bat 1 8 
call text-read-lines-alt.bat 9 20 
pause 

:: multiselect (a) (b) (a) (b) etc... 
call text-read-lines-alt.bat 1 20 23 29 
pause 

:: call then calling outside text range (outputs first but not second) 
call text-read-lines-alt.bat 1 8 
call text-read-lines-alt.bat 80 100 
pause 

:: another call outside text range (outputs nothing) 
call text-read-lines-alt.bat 90 100 
pause 

文本的讀線-alt.bat:

@echo off 
setlocal EnableDelayedExpansion 
set file=WinSCP-5.11.2-ReadMe.txt 

SET "parms=%*" 

call :ReadInLines 
call :EchoLines 

echo insert other code here 
endlocal 
(goto) 2>nul 

:ReadInLines 
set Counter=0 
for /f "DELIMS=" %%i in ('type %file%') do (
    set /a Counter+=1 
    title Lines In File: !Counter! 

    CALL :gate !counter! 

    IF DEFINED RECORD set "Line_!Counter!=%%i" 
) 
(goto) 2>nul 

:EchoLines 
For /L %%C in (1,1,%Counter%) Do IF DEFINED line_%%C (echo %%C. !Line_%%C!) 
GOTO :EOF 

:gate 
SET "record=" 
IF NOT DEFINED parms GOTO :EOF 
FOR /f "tokens=1,2*" %%x IN ("%parms%") DO (
    IF %1 gtr %%y SET "parms=%%z"&GOTO gate 
    IF %1 geq %%x SET "record=Y" 
) 
GOTO :EOF 

和這裏是所有的辛勤工作去了到:http://old-school-gamer.tk/batch/text-reader/releases/ :D

回答

0
@ECHO OFF 
setlocal EnableDelayedExpansion 
set file=WinSCP-5.11.2-ReadMe.txt 
set file=100lines.txt 

SET "parms=%*" 

call :ReadInLines 
call :EchoLines 

echo insert other code here 
pause 
endlocal 
(goto) 2>nul 

:ReadInLines 
set Counter=0 
for /f "DELIMS=" %%i in ('type %file%') do (
    set /a Counter+=1 
    title Lines In File: !Counter! 

    CALL :gate !counter! 

    IF DEFINED RECORD set "Line_!Counter!=%%i" 
) 
(goto) 2>nul 

:EchoLines 
For /L %%C in (1,1,%Counter%) Do IF DEFINED line_%%C (echo %%C. !Line_%%C!) 
SET /a count=0 
For /L %%C in (1,1,%Counter%) Do IF DEFINED line_%%C (
SET /a count +=1 
echo !count!. !Line_%%C! 
) 
GOTO :EOF 

:gate 
SET "record=" 
IF NOT DEFINED parms GOTO :EOF 
FOR /f "tokens=1,2*" %%x IN ("%parms%") DO (
IF %1 gtr %%y SET "parms=%%z"&GOTO gate 
IF %1 geq %%x SET "record=Y" 
) 
GOTO :EOF 

我開始通過記錄parms =命令尾。我的100lines.txt文件只是包含100行「線路1」 ..「line100」

CALL荷蘭國際集團的:gate程序設置或清除record來指定counter線是否應該被記錄或不是一個文件。 if defined適用於目標變量的當前狀態 - 是否定義。

:gate例行檢查parms串,分配%%x到所述第一令牌,%%y第二和%%z所提供的參數的其餘部分。如果%1(來自調用循環)中的當前行號大於第二個參數,則將parms指定給,其餘的字符串(將刪除前兩個參數)並重試。parms最終會變空,所以不要嘗試處理它。

如果第二個參數不大於當前行,請查看當前行是否大於或等於第一個參數。如果是這樣,請將record設置爲一個值,以便它變成定義爲,因此調用循環將記錄它。所以說 - params10 13 21 28%%x將被設置爲10,%%y13%%z21 28。直到第9行,行號不會是geq 10,因此record仍然清晰。對於第10至13行,將設置record,並且在第14,14行記錄的行大於13,因此parms變爲21 28,我們再試一次。

我也修改了輸出程序。如果line_%%C被定義,if defined門將只執行echo,所以不會有空行。缺點是報告將顯示文件中的行號。

第二個過程使用相當明顯的方法來串行化輸出以生成行號。


例如,

如果數據文件包含

行1
第2行
第3行
第4行
第5行
第6行
第7行
線8

然後如果提供的參數是3 5含義 「的行3至5包含性的」,那麼輸出來自

For /L %%C in (1,1,%Counter%) Do IF DEFINED line_%%C (echo %%C. !Line_%%C!) 

  • Line 3
  • Line 4
  • 5號線
  • (注意每一行都有其原來行號。

    和從

    SET /a count=0 
    For /L %%C in (1,1,%Counter%) Do IF DEFINED line_%%C (
    SET /a count +=1 
    echo !count!. !Line_%%C! 
    ) 
    

    的輸出將是

    1. 線3
    2. 線4
    3. 線5

    如果離開到位這些輸出機制既(簡單地將相同的數據,但具有修改的行號)

    ,輸出將是

  • 線3
  • 線4
  • 線5
  • 線3
  • 線4
  • 線5
  • 即,與所述第二級聯的第一輸出。

    +0

    花了我一段時間來弄清楚xD的這個blob,但好吧,所以基本上我會做一些事情例如: call text-read-lines-alt.bat 1 20 這將在輸出中產生第1到第20行。 我可以很容易地添加一個部分,說如果它在文件末尾停止輸出:D 有一件事我沒有得到的是%% Z部分。這是必要的嗎? afaik這是一個多選的權利?我可以這樣使用: call text-read-lines-alt.bat 1 20 23 25 哪會產生1-20和23-25 是嗎? – Ushida

    +0

    好讓沒有做什麼我想它做: http://prntscr.com/gybcbl 但是......它工作正常,如果需要 謝謝你,我可以只調用批處理文件兩次:d 你想讓我把你作爲一個學分嗎? – Ushida

    +0

    也調用它一次爲1-8和再次爲9-20產生成功,但也產生1-12? 東西關閉,我不能告訴什麼 – Ushida

    0

    希望msr.exe可以幫助你進行這樣的文件文本處理。

    msr -p file-paths -L begin-line -N end-line-PAC隱藏路徑/信息/顏色。

    但在同一時間不能讀取2個範圍(read lines 1 to 8 but also read lines 5 to 13):

    msr -p test.txt -L 1 -N 8 + msr -p text.txt -L 5 -N 13

    參見下面的屏幕截圖。

    msr.exe/msr.gcc*約爲1.5MB一個EXE工具my open project在Windows和Linux不依賴於文件/管材文本處理。見文檔像peformance comparision with grep and findstrbuilt-in usage doc by running exefile line range

    +0

    謝謝程序完美的工作,但我想不使用可執行文件,除非絕對需要,這可能證明對另一個項目tho有用:D – Ushida

    相關問題