2017-10-16 78 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

    相关问题