首页 > 其他分享 >子函数对指定文件指的读取指定的行(ReadLine.bat)

子函数对指定文件指的读取指定的行(ReadLine.bat)

时间:2024-01-24 11:02:06浏览次数:19  
标签:bat set goto 指定 echo 子函数 ReadLine loop 读取

经常要对文件的指定行进行读取,特写了一个读取文件指定行的小程序段(ReadLine.Bat),方面以后调用。

  使用也比较简单:"Call ReadLine <文件名> <跳过的行数> <读取行数>"就可以了。比如在一个批处理里加上一句"Call ReadLine a.txt 5 7",那么将跳过a.txt文件的前5行,显示下面的7行字符,也包含空行。也可以不指定第三个参数。

ReadLine.Bat
@echo off&SetLocal ENABLEDELAYEDEXPANSION
if "%1"=="" (goto --help) else (set file=%~s1)
if "%2"=="" (set first="delims=: tokens=1*") else (set first="skip=%2 delims=: tokens=1*")
if "%3"=="" (
        for /f %first% %%a in ('findstr /n .* %file%') do echo/%%b
        goto :EOF
)
set last=%3
set loop=0
for /f %first% %%a in ('findstr/n .* %file%') do (
        if not defined lxmxn (echo/%%b&set /a loop+=1) else (goto :EOF)
        if "!loop!"=="%last%" set lxmxn=Nothing
)
GOTO :EOF

:--help
echo/======================================
echo/本程序段需要带参数才能正常运行
echo/&echo/Usage:&echo/Call ReadLine ^<文件名^> ^<跳过行数^> ^<读取行数^>
echo/&echo/例如:call ReadLine aa.txt 5 7 ,将跳过aa.txt文件的前5行,读取下面的7行字符
echo/&echo/如果^<跳过行数^>没有指定,就从文件第一行读取
echo/&echo/指定^<读取行数^>时必须指定^<跳过行^>
echo/======================================
goto :eof

-----------------------------------------------------------------------------------------

『第 7 楼』:  

我暂时想不到用版主的文件只读取第一行的方法,所以擅自改动了一下,把参数2和参数3换了一下位置,用ReadLine a.txt 1即可读取第一行,用ReadLine a.txt 1 1读取第二行。谢谢版主,这个文件很好用,同时还望版主见谅。

@echo off&SetLocal ENABLEDELAYEDEXPANSION
if "%1"=="" (goto --help) else (set file=%~s1)
if "%3"=="" (set first="delims=: tokens=1*") else (set first="skip=%3 delims=: tokens=1*")
if "%2"=="" (
        for /f %first% %%a in ('findstr /n .* %file%') do echo/%%b
        goto :EOF
)
set last=%2
set loop=0
for /f %first% %%a in ('findstr/n .* %file%') do (
        if not defined lxmxn (echo/%%b&set /a loop+=1) else (goto :EOF)
        if "!loop!"=="%last%" set lxmxn=Nothing
)
GOTO :EOF
:--help
echo/======================================
echo/本程序段需要带参数才能正常运行
echo/&echo/Usage:&echo/Call ReadLine ^<文件名^> ^<读取行数^> ^<跳过行数^>
echo/&echo/例如:call ReadLine aa.txt 5 7 ,将跳过aa.txt文件的前7行,读取下面的5行字符
echo/&echo/如果^<跳过行数^>没有指定,就从文件第一行读取
echo/======================================
goto :eof

-----------------------------------------------------------------------------------------

『第 8 楼』:  

跳过行数是零不就能读取第一行了吗? 

-----------------------------------------------------------------------------------------

『第 10 楼』:  

可以运行原文件的ReadLine a.txt 0 1,看有什么提示,在我这里会提示错误

-----------------------------------------------------------------------------------------

『第 12 楼』:  

你这个写的有点复杂。其实解决办法可以简化一点。
@echo off 
setlocal EnableDelayedExpansion
set loop=0
set /a skipline=%2-1
for /f "tokens=1 skip=%skipline% delims=" %%a in (%1) do (
        set /a loop=!loop!+1
        if "!loop!" leq "%3" (echo %%a) else goto :eof
)
goto :eof

-----------------------------------------------------------------------------------------

『第 13 楼』:  

测试以上各楼层大神的版本,好像用起来总有点不手,擅自改动如下,自用时目前满足所有情况,还请多指教。

:ReadLine <DataFileName> <skipline> <readline>
:: DataFileName        待读入文件
:: skipline        跳过行数,空或非有效数字则默认为0
:: readline        读取行数,空或非有效数字则默认为0,0则表示为剩余的全部
@echo off&SetLocal ENABLEDELAYEDEXPANSION
if "%1"=="" goto :--help
set /a loop=0
set /a skipline=%~2+0
set /a readline=%~3+0
if %skipline% lss 1 (
        set "for_var=usebackq tokens=1 delims="
) else (
        set "for_var=usebackq tokens=1 skip=%skipline% delims="
)
if %readline% lss 1 (
        set /a step=0
        set /a readline=1
) else (
        set /a step=1
)
for /f "%for_var%" %%a in ("%~f1") do (
        set /a loop+=step
        if !loop! leq %readline% (echo %%a) else goto :eof
)
goto :eof
:--help
echo/======================================
echo / 本程序段需要带参数才能正常运行
echo/&echo/Usage:&echo/Call ReadLine ^<文件名^> ^<跳过行数^> ^<读取行数^>
echo/&echo / 例如:call ReadLine aa.txt 5 7 ,将跳过 aa.txt 文件的前 5 行,读取下面的 7 行字符
echo/&echo / 如果 ^<跳过行数^> 没有指定,就从文件第一行读取
echo/&echo / 指定 ^<读取行数^> 时必须指定 ^<跳过行^>
echo/======================================
goto :eof 

-----------------------------------------------------------------------------------------

这里只截取了部分楼层的,完整的可以去下面的连接去看看原文。

 

出处:https://www.cn-dos.net/forum/viewthread.php?tid=28639

标签:bat,set,goto,指定,echo,子函数,ReadLine,loop,读取
From: https://www.cnblogs.com/mq0036/p/17984144

相关文章

  • mybatis + oracle 批量修改
    service层:intbatchSize=1000;inttotalData=waferOrderList.size();intstartIndex=0;while(startIndex<totalData){intendIndex=Math.min(startIndex+batchSize,totalData);List<WaferOrder>sub......
  • # yyds干货盘点 # 解析json数据,指定列去解析报错如何破?
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【哎呦喂 是豆子~】问了一个Python解析的问题。问题如下:大佬们请问下这个是啥情况呀 解析json数据 指定列去解析报错JSONDecodeError:Expecting','delimiter:line1column73(char72)数据不多我就一个个去试指......
  • Python UDP协议发送指定格式报文
      importstructimporttimeimportsocketimportthreading#udp发送数据defsend_data(udp_socket,target_ip,target_port,send_msg):try:udp_socket.sendto(send_msg,(target_ip,target_port))exceptExceptionase:......
  • 使用jar命令替换jar包中指定文件
    一、jar命令用法`1. -c创建新的归档文件3.-t列出归档目录和文件5.-x解压缩已归档的指定(或所有)文件7.-u更新现有的归档文件9.-v在标准输出中生成详细输出/提供更详细输出信息11.-f指定归档文件名/为压缩包指定名字13.-m包含......
  • bat启动多个ping 窗口持续ping同时开启指定的软件 批处理
    将代码复制存为BAT 修改IP,和软件路径即可使用。 @echooffcdclsstartcmd/c"TITLEPingServer192.168.103.7&&ping192.168.103.7-t"startcmd/c"TITLEPingServer192.168.100.156&&ping192.168.100.156-t"startcmd/c"TITLEPing......
  • MybatisPlus
    MybatisPlus想念mp的第xxx天......
  • 在 SpringBoot 项目中使用 Mybatis 打印 SQL 日志
    前言我们在项目中使用的持久层框架大部分都是mybatis,如果在日志中能打印sql的话,对于我们排查问题会更加方便。第一种方式:修改mybatis配置修改配置mybatis:configuration:log-impl:org.apache.ibatis.logging.slf4j.Slf4jImpllogging:level:com.imooc.p......
  • 剔除任意指定参数配置
    只需要修改需要剔除的参数key(如:redirectUrl)#剔除$args中的redirectUrl参数server{listen80;server_namewww.mynginx.rewrite;location/search{#在参数前加入&,并赋值给args_tmpset$args_tmp&${args};#正则判断进行剔......
  • 【Windows运维系列5】一键快速修改Windows端口(附bat脚本)
    上篇文章中,我们介绍了,如何通过Powershell脚本来实现端口的修改,我们通过这种方式修改了用户在Hostease的Windows服务器的端口,并且有效阻止了一些恶意IP的登陆,而本文中将进一步实现自动运行脚本来修改Windows端口,相信一些大神已经发布过类似的脚本,我针对脚本进行了一些优化下面是我已......
  • 微前端(矩阵项目)代码将单个文件合并到指定分支
    确保你当前位于要合并文件的源分支上。可以使用gitbranch命令查看当前分支,并使用gitcheckout命令切换到源分支。使用gitcheckout命令切换到目标分支,即你想要合并文件的分支。gitcheckoutsource_branch--path/to/filesource_branch是包含要合并文件的源分支,path/to/f......