【问题标题】:Deleting last n lines from file using batch file使用批处理文件从文件中删除最后 n 行
【发布时间】:2012-09-02 23:33:44
【问题描述】:

如何使用批处理脚本从文件中删除最后 n 行

我对批处理文件一无所知,我是第一次写批处理文件。

我应该如何编写这个批处理文件?

对于 Windows7

试试看

<Project_Name>

    <Noter>
        <Common>
        <File>D:\Project_Name\Util.jar</File>
        <File>D:\Project_Name\Noter.bat</File>
        <File>D:Project_Name\Noter.xml</File>
        <File>D:Project_Name\Noter.jar</File>       
        </Common>

        <Project_Name>
            <File>D:\Util.bat</File>
            <File>D:\Util.xml</File>
            <File>D:\log.bat</File>
        </Project_Name>
    </Noter>
    <CCNET>

【问题讨论】:

  • @Desislav Kamenov 对于 Windows 7..

标签: file windows-7 batch-file


【解决方案1】:

这是删除最后 N 行的完整脚本

  • 统计总行数
  • 设置 Line = Line - N ,只保留处理行号
@echo OFF
setlocal EnableDelayedExpansion

set LINES=0
for /f "delims==" %%I in (infile.txt) do (
    set /a LINES=LINES+1    
)

echo Total Lines : %LINES%
echo.

:: n = 5 , last 5 line will ignore 
set /a LINES=LINES-5

call:PrintFirstNLine > output.txt

goto EOF

:PrintFirstNLine
set cur=0
for /f "delims==" %%I in (infile.txt) do (      
    echo %%I        
    ::echo !cur! : %%I      
    set /a cur=cur+1    
    if "!cur!"=="%LINES%" goto EOF
) 

:EOF 

exit /b

这里call:PrintFirstNLine &gt; output.txt 会将输出以外部文件名作为output.txt

输出样本输入

<Project_Name>      
<CBA_Notifier>      
    <Common>        
    <File>D:\CBA\CBA_Notifier\Project_Name\IPS-Util.jar</File>      
    <File>D:\CBA\CBA_Notifier\Project_Name\Notifier.bat</File>      
    <File>D:\CBA\CBA_Notifier\Project_Name\Notifier.xml</File>      
    <File>D:\CBA\CBA_Notifier\Project_Name\Notifier.jar</File>              
    </Common>       
    <Project_Name>      
        <File>D:\CBA\CBA_Notifier\IPS-Util.bat</File>   

删除最后 5 行

更新

:PrintFirstNLine
set cur=0
for /F "tokens=1* delims=]" %%I in ('type "infile.txt" ^| find /V /N ""') do (
   if "%%J"=="" (echo.) else (
        echo.%%J
        set /a cur=cur+1    
        )  

   if "!cur!"=="%LINES%" goto EOF
)

【讨论】:

  • 代码工作正常,但问题是,当它得到一个空行时,它会在那个地方打印Echo OFF
  • @SachinMhetre 它在 WinXP 上非常适合我 :(,它的转义空行
  • 知道了,在 WinXP FOR /? 自动忽略空行:(
  • @SachinMhetre,更新了答案,也在win7中测试。希望这对你有用
  • 这是一个很好的解决方案,但也有一些缺点。当行以] 开头时,您将丢失字符。如果存在像 \..\..\..\..\..\windows\system32\calc.exe 这样的行,你会遇到真正的麻烦
【解决方案2】:

此脚本将接受 1 个参数,即要中继的文件,创建一个临时文件,然后用较短的文件替换原始文件。

@echo off
setlocal enabledelayedexpansion
set count=
for /f %%x in ('type %1 ^| find /c /v ""') do set /a lines=%%x-5
copy /y nul %tmp%\tmp.zzz > nul
for /f "tokens=*" %%x in ('type %1 ^| find /v ""') do (
  set /a count=count+1
  if !count! leq %lines% echo %%x>>%tmp%\tmp.zzz
)
move /y %tmp%\tmp.zzz %1 > nul

如果原始文件是 5 行或更少行,主输出例程将不会创建文件。为了解决这个问题,我使用copy /y null 创建一个零字节文件。

如果您不想有一个空文件,只需删除 copy /y nul 行,并将其替换为以下行:

if %lines% leq 0 del %1

您应该使用一种方法或另一种方法,否则 5 行或更少行的源文件将保持不变。 (既没有替换也没有删除。)

【讨论】:

    【解决方案3】:

    要从文件中删除最后一行,

    1 复制文件所需的起始行,例如 from-e:\original.txt 2 将它们粘贴到新文件中,例如 - e:\new\newfile1.txt

    代码感谢给我这个代码的人: 记住如果你有动机,甚至血hb = 6,一切都可以完成。但总是需要大自然的帮助,因为你是它的一部分

    @echo off & setLocal enableDELAYedeXpansion 设置 N= for /f "tokens=* delims= " %%a in (e:\4.txt) 做 ( 设置 /a N+=1 如果!N! gtr 264 转到:做了

    e:\new4.txt 回显.%%a ) :做了

    如果您有 800 个文件,则使用 excel 为 800 制作代码,然后将其复制到记事本并使用 Ctrl+h 替换没有空格的空格。然后将文件重命名为 haha​​.bat 。在编号为 1.txt 2.txt 3.txt 等文件的文件夹中运行。任何询问者欢迎 Erkamaldev@gmail.com “Bharata 万岁”

    【讨论】:

      【解决方案4】:

      一种编码较少的慢方法:

      set input=file.txt
      set remove=7
      
      for /f "delims=" %i in ('find /c /v "" ^< "%cd%\%input%"') do set lines=%i
      set /a lines-=remove
      for /l %i in (1,1,!lines!) do findstr /n . log.txt | findstr /b %i:
      

      可能被重定向到一个文件。
      每行都以行号为前缀;可以通过额外的编码删除。
      我的回答中带有/g 标志的更快版本:
      How to split large text file in windows?

      在 Win 10 CMD 中测试,文件大小为 577KB,7669 行。

      【讨论】:

        猜你喜欢
        • 2017-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        • 2018-02-24
        • 1970-01-01
        相关资源
        最近更新 更多