我搜索了大量的互联网,无法找到使用批处理代码在文本文件的最后10行中查找特定单词的方法。到目前为止,我有这个在整个文件中查找文本。
>nul find "Example Words" examplefile.txt && (
REM Found...
goto next) || (
REM Not Found...
goto home
)
所以,再一次,它的作用是在整个文件中搜索示例单词,而我需要的是一种只在<中查找这些单词的方法strong>最后10行?
答案 0 :(得分:0)
这包括/排除文件顶部或底部的n行。
<强>剪切强>
filter cut {t|b} {i|x} NumOfLines
从文件的顶部或底部剪切行数。
t - top of the file
b - bottom of the file
i - include n lines
x - exclude n lines
示例强>
cscript //nologo c:\folder\filter.vbs cut t i 5 < "%systemroot%\win.ini"
脚本filter.vbs
Set Arg = WScript.Arguments
set WshShell = createObject("Wscript.Shell")
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
Set rs = CreateObject("ADODB.Recordset")
With rs
.Fields.Append "LineNumber", 4
.Fields.Append "Txt", 201, 5000
.Open
LineCount = 0
Do Until Inp.AtEndOfStream
LineCount = LineCount + 1
.AddNew
.Fields("LineNumber").value = LineCount
.Fields("Txt").value = Inp.readline
.UpDate
Loop
.Sort = "LineNumber ASC"
If LCase(Arg(1)) = "t" then
If LCase(Arg(2)) = "i" then
.filter = "LineNumber < " & LCase(Arg(3)) + 1
ElseIf LCase(Arg(2)) = "x" then
.filter = "LineNumber > " & LCase(Arg(3))
End If
ElseIf LCase(Arg(1)) = "b" then
If LCase(Arg(2)) = "i" then
.filter = "LineNumber > " & LineCount - LCase(Arg(3))
ElseIf LCase(Arg(2)) = "x" then
.filter = "LineNumber < " & LineCount - LCase(Arg(3)) + 1
End If
End If
Do While not .EOF
Outp.writeline .Fields("Txt").Value
.MoveNext
Loop
End With
这是一个通过计算dir
命令输出中的行来计算文件夹的示例代码。
@SETLOCAL ENABLEDELAYEDEXPANSION
@CD C:\newfolder
@set count=0
@For /f "delims=" %%A in ('dir C:\newfolder\*.* /ad /s /b') Do (
set /a count=!count!+1
@rem If !Count! gtr 1 echo Num of folders
)
Set /a num=%random% %% %Count% + 1
Echo %num%
@For /f "skip=%num% delims=" %%A in ('dir C:\newfolder\*.* /ad /s /b') Do (
Echo this is nth random folder
Echo Copy "%~dpnx0" "%%A"
Exit /b
)
答案 1 :(得分:0)
首先,计算文本文件中的行数:
for /F %%C in ('^< "examplefile.txt" find /C /V ""') do set "COUNT=%%C"
然后确定要跳过的行数(例如,除了最后10行之外的所有行):
if %COUNT% GTR 10 (set /A "SKIP=COUNT-10") else (set "SKIP=0")
最后,使用more
command实际跳过这些行:
more +%SKIP% "examplefile.txt" | > nul findstr /L /I "Example Words" && (
rem Found
goto next
) || (
rem Not Found
goto home
)
使用findstr
而非find
指定多个 SPACE 分隔的搜索字符串或字词(例如此处为Example
和Words
)。使用/I
选项进行不区分大小写的搜索。
请注意,当输入文件包含65535或更多行时,more
需要用户输入。它将 SPACEs 转换为 TABs ,但这不应该改变任何内容,因为您对搜索不感兴趣,因为您只搜索单词。
这是一种更复杂,效率更低的方法,依赖于for /F
loop,同时使用上面派生的COUNT
变量。它需要skip
的{{1}}选项,其构建方式如下:
for /F
然后是前面提到的set /A "SKIP=COUNT-10"
if %SKIP% GTR 0 (set "SKIP=skip=%SKIP%") else (set "SKIP=")
循环:
for /F
在循环中单独搜索每一行;一旦遇到匹配,就会执行for /F "%SKIP% delims=" %%L in ("examplefile.txt") do (
echo(%%L| > nul findstr /L /I "Example Words" && (
rem Found
goto next
)
)
ren Not Found
goto home
; goto next
打破了循环上下文,因此goto
不再执行其正文内的任何命令。
注意for /F
忽略空行,并且默认情况下以分号(for /F
)开头。一些特殊字符(;
,^
,&
,(
,)
,"
,<
,{{1} })可能会导致管道中的>
命令出现问题(|
)。