2017-02-08 2 views
-2

Ich habe das große Internet durchsucht und kann keine Möglichkeit finden, nach bestimmten Wörtern in und nur in den letzten 10 Zeilen einer Textdatei mit Stapelcode suchen. Bisher habe ich das was nach Text in der ganzen Datei sucht.So finden Sie bestimmte Wörter in den letzten 10 Zeilen der Datei mit Batch

>nul find "Example Words" examplefile.txt && (
REM Found... 
goto next) || (
REM Not Found... 
goto home 
) 

Also, noch einmal, was dies tut, ist es die ganzen Datei für Beispiel Worte sucht, während das, was ich brauche eine Möglichkeit, für diese Worte nur in den letzten 10 Zeilen zu suchen ist?

+0

Sind es die letzten ** 10 ** oder die letzten ** 2 ** Zeilen? Bitte klären Sie! – aschipfl

+1

@aschipfl: Existiert '10' Typen von Leuten: diejenigen, die das binäre System kennen und diejenigen, die nicht ... – Aacini

+0

Hehe, @Aacini ... Ich hoffe das OP klärt aber ... – aschipfl

Antwort

0

Zuerst die Anzahl der Zeilen in der Textdatei zählen:

for /F %%C in ('^< "examplefile.txt" find /C /V ""') do set "COUNT=%%C" 

Dann bestimmen, wie viele Zeilen übersprungen werden (alle bis auf die letzten 10 Zeilen, zum Beispiel):

if %COUNT% GTR 10 (set /A "SKIP=COUNT-10") else (set "SKIP=0") 

Schließlich verwenden die more command, um tatsächlich die Linien überspringen:

more +%SKIP% "examplefile.txt" | > nul findstr /L /I "Example Words" && (
    rem Found 
    goto next 
) || (
    rem Not Found 
    goto home 
) 

Verwenden findstr statt find auf mehr SPACE -separated Suchbegriffe oder Worte (wie Example und Words hier) angeben. Verwenden Sie die Option /I, um die Groß- und Kleinschreibung nicht zu beachten.

Beachten Sie, dass more Benutzereingaben erwartet, wenn die Eingabedateien 65535 oder mehr Zeilen enthalten. Es konvertiert SPACEs zu TABs, aber dies sollte nichts hier ändern, da Sie nicht für sie sowieso für die Suche interessiert sind, da Sie nur nach Wörtern suchen.


Hier ist ein komplizierter und weniger effizienter Ansatz auf einem for /F loop angewiesen, auch mit den COUNT Variable wie oben abgeleitet.Es braucht die skip Möglichkeit for /F, die wie folgt aufbauen:

set /A "SKIP=COUNT-10" 
if %SKIP% GTR 0 (set "SKIP=skip=%SKIP%") else (set "SKIP=") 

Dann gibt es die oben genannten for /F Schleife:

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 

Jede Zeile einzeln in der Schleife gesucht wird; sobald eine Übereinstimmung festgestellt wird, wird goto next ausgeführt; goto unterbricht den Schleifenkontext, daher führt for /F keine Befehle mehr in seinem Körper aus.

Regard die for /F leere Zeilen ignoriert, und auch solchen Anfang mit einem Semikolon (;) standardmäßig. Einige Sonderzeichen (^, &, (, ), ", <, >, |) können Probleme verursachen mit dem echo Befehl in dem Rohr (|).

+0

Es scheint, dass dies nicht funktioniert. Immer wenn ich das zu meinem Code hinzufüge, wird es sofort geschlossen. – R2bEEaton

+0

Was haben Sie zu Ihrem Code hinzugefügt und was genau ist das Problem? – aschipfl

+0

In diesem habe ich den Abschnitt nach: AfterQPos mit ... 'für/F %% C in ('^ <"% Appdata% \. Minecraft \ logs \ latest.log "finden/C') setzen Sie" COUNT = %% C "' Neue Zeile 'wenn% COUNT% GTR 10 (set/A" SKIP = COUNT-10 ") sonst (setze" SKIP = ")' Neue Zeile 'more +% SKIP%"% appdata% \. Minecraft \ logs \ latest.log "| > nul findstr/L/I "Verbindung mit dem Server ..." && ( rem Gefunden weiter ) || ( rem Not Found gehe nach Hause ) 'Wenn ich dies tun, anstatt zu wiederholen, bis es die Wörter findet, schließt es sofort. – R2bEEaton

0

Dies umfasst/schließt n Zeilen von oben oder unten in einer Datei aus.

Cut

filter cut {t|b} {i|x} NumOfLines 

Schneidet die Anzahl der Zeilen von oben oder unten der Datei.

t - top of the file 
b - bottom of the file 
i - include n lines 
x - exclude n lines 

Beispiel

cscript //nologo c:\folder\filter.vbs cut t i 5 < "%systemroot%\win.ini" 

Das Skript 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 

Hier ist ein Beispielcode Ordner durch Zählen der Zeilen in der dir Befehlsausgabe zu zählen.

@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 
) 
+0

Nur um zu klären, gibt es keine Möglichkeit, dies im Batch zu tun? – R2bEEaton

+0

Weil es da ist. Es wird schmerzhaft langsam sein. – Freddie

+0

Verwenden Sie eine 'for/f'-Schleife, zählen Sie die Zeilen im verzögerten Expansionsmodus, lesen Sie die Datei ein zweites Mal mit' for/f' verwerfen alle außer den letzten n Zeilen ausgearbeitet in Schritt 1. – Freddie

Verwandte Themen