Batch file 如何使用for/f skip删除文本文件开头的行

Batch file 如何使用for/f skip删除文本文件开头的行,batch-file,for-loop,skip,Batch File,For Loop,Skip,我担心仍在遭受扩张功能障碍的折磨。我正试图从日志文件的开头剥离GTR大于100的行。在我看来,下面的代码应该可以工作,但如图所示,for/f“skip”近端的代码不起作用。有人能解释一下这里出了什么问题吗?谢谢大家! @echo off SETLOCAL EnableDelayedExpansion Set "logfile=abc.log" rem ~ Get line count and exit if not greater 100 For /f %%G in ('Type "!l

我担心仍在遭受扩张功能障碍的折磨。我正试图从日志文件的开头剥离GTR大于100的行。在我看来,下面的代码应该可以工作,但如图所示,for/f“skip”近端的代码不起作用。有人能解释一下这里出了什么问题吗?谢谢大家!

@echo off
SETLOCAL EnableDelayedExpansion

Set "logfile=abc.log"

rem ~ Get line count and exit if not greater 100
  For /f %%G in ('Type "!logfile!"^|Find "" /v /c') Do SET /a linecount=%%G
  If not %linecount% GTR 100 exit /b

rem ~ get number lines to skip
  set /a skiplines=!linecount! -100
  echo. &echo logfile=%logfile%, linecount=%linecount%, skiplines=%skiplines%
  :: Above displays: logfile=abc.log, linecount=243, skiplines=143
::问题是:

rem ~ skip the first %skiplines% in file and write remaining to temp
  for /f "skip=!skiplines! delims=*" %%H in ("!logfile!") do echo %%H >>newfile.tmp
::上面给出错误:“!skiplines!delims=*”此时意外出现

:(如上所述,将0写入newfile.tmp)

一个解决方案-----

我正在编辑以突出显示这一行解决方案以及已接受的答案。该代码需要usebackq,包含在@Magoo answer中。这一功能:

for /f "usebackqskip=%skiplines% delims=*" %%H in ("!logfile!") do echo %%H>>newfile.tmp

这是一个在过程中何时对
!var!
%var%
求值的问题。
%var%
首先求值(替换),但
!var!
仅在建立循环的条件之后才求值,因此该位置不应出现
!var!

解决方案是只按预期使用
!var!
(在循环内),其中值是在运行时确定的,而不是在分析时确定的。使用
%var%
访问分析时间值。不要将
!var!
%var%
视为循环外的等效值。对于come命令,它们实际上是,但不是全部

顺便说一句-观察当
行数
为100时发生的情况。
跳过
不喜欢0。如果我是你,我会将
全球技术法规
更改为
GEQ


这里有一个例程可以演示正在发生的事情。它使用我的工作区域-毫无疑问,您需要为您的系统修改它

@ECHO关闭
SETLOCAL
::正在设置数据
设置“sourcedir=U:\sourcedir”
设置“logfile=abc.log”
PUSHD“%sourcedir%”
(
对于(1,1,99)中的/l%%a,执行回显线路%%a
)>%logfile%
呼叫:进程
>>“%logfile%”回显行100
呼叫:进程
>>“%logfile%”回显行101
呼叫:进程
>>“%logfile%”回显行102
呼叫:进程
邻苯二胺
后藤:eof
:进程
对于/f%%G in('type”%sourcedir%\%logfile%“^ Find”“/v/c'),请设置/a行数=%%G
在日志文件中回显%linecount%行
如果%linecount%leq 100退出/b
回音超过100行!!
SET/a skipline=行数-100
设置/a skiplines2=%linecount%-100
ECHO-----观察本指令的响应
SET/a skiplines3=!linecount!-100
回声------这是因为评估和替换的顺序
设置skipline
::删除输出文件
DEL newfile.tmp>NUL 2>NUL
对于(“%sourcedir%\%logfile%”中的/f“usebackqskip=%skiplines%delims=*”%%H,请执行ECHO%%H>>newfile.tmp
回音=====================
跳过%logfile%的%skiplines%后的回显结果为
键入newfile.tmp
回音=====================
退出/b
结果应该是

99 lines IN log file
100 lines IN log file
101 lines IN log file
MORE than 100 lines!!
------- observe response from this instruction
Missing operator. 
------- this is because of the sequence-of-evaluation-and-substitution
skiplines=1
skiplines2=1
skiplines3=0
=====================
after skipping 1 of abc.log result is
line 2 
line 3 
...
line 100 
line 101 
=====================
102 lines IN log file
MORE than 100 lines!!
------- observe response from this instruction
Missing operator.
------- this is because of the sequence-of-evaluation-and-substitution
skiplines=2
skiplines2=2
skiplines3=0
=====================
after skipping 2 of abc.log result is
line 3 
line 4 
...
line 101 
line 102 
=====================

可能是因为您的文件位于
!logfile!
,而不是
!countfile!
。%skiplines%应该可以工作,因为它与设置的语句不同。

谢谢@Magoo。了解您对使用的看法。(我在循环中使用了它,因为我想处理多个文件,但在跟踪问题时遇到了太多问题。)但问题仍然存在…两个变量都不起作用。%skiplines%在for中得到的值为0。我是否在您的答案中遗漏了什么?还有其他方法。也许我应该跳过“跳过”"? :)谢谢。我相信修改一下会有用的。我明天会投票给你,等我有机会更仔细地研究它并获得更好的理解。谢谢你抓到坏文件变量。我修复了。请参阅注释。原始代码显示了错误的文件变量,正如ths在回答中所指出的。(为发布而移植旧代码时出错。我的错误。)错误!斯基普林斯!正如Magoo和ths所指出的,是在引发错误。然而,即使使用了正确的文件var(logfile)和%skiplines%,For/f“skip”也不会写入tmp文件。文章末尾的解决方案使代码正常工作,并回答了标题中的问题。@Magoo接受的答案很好地回答了“有人能解释一下这里出了什么问题吗?”
99 lines IN log file
100 lines IN log file
101 lines IN log file
MORE than 100 lines!!
------- observe response from this instruction
Missing operator. 
------- this is because of the sequence-of-evaluation-and-substitution
skiplines=1
skiplines2=1
skiplines3=0
=====================
after skipping 1 of abc.log result is
line 2 
line 3 
...
line 100 
line 101 
=====================
102 lines IN log file
MORE than 100 lines!!
------- observe response from this instruction
Missing operator.
------- this is because of the sequence-of-evaluation-and-substitution
skiplines=2
skiplines2=2
skiplines3=0
=====================
after skipping 2 of abc.log result is
line 3 
line 4 
...
line 101 
line 102 
=====================