Как насчет таких изменений?
ЭХО %% A | найти "твое слово" >> outputFile.txt
Если вам не нужен более сложный поиск с использованием Cygwin или PowerShell?
Но это может быть довольно медленным, чтобы перебрать строки файла, используя пакетный скрипт, может быть, короткий код C #, скомпилированный CSC, будет работать лучше ...
Дайте мне знать, если хотите.
Мой тестовый пакет теперь выглядит так, но если вы не отфильтруете перед обработкой, счетчик будет работать в исходных строках, а не в результате (некоторые могут быть пустыми).
@ECHO OFF
setlocal enabledelayedexpansion
del textfile2.txt
SET /A maxlines=10
SET /P maxlines=Enter number of lines to be moved to new txt document:
SET /A linecount=0
FOR /F "delims=" %%A IN (x.txt) DO (
IF !linecount! GEQ %maxlines% GOTO ExitLoop
SET /A linecount+=1
ECHO %%A | find ";" >> textfile2.txt
)
:ExitLoop
ECHO All Done.
В случае, если версия C # может выглядеть, например, (предположим, немного более читабельно по сравнению с пакетными сценариями):
using System;
using System.Collections.Generic;
using System.IO;
namespace BatchTest
{
class Program
{
public static void Main(string[] args)
{
String inFile = args[0], outFile = args[1], word = args[2], line;
int nextLines = 100;
Queue<String> qt = new Queue<String>();
using (StreamReader sr = new StreamReader(inFile))
using (StreamWriter sw = new StreamWriter(outFile))
while ((line = sr.ReadLine()) != null)
{
qt.Enqueue(line);
if (line.Contains(word))
{
foreach (var el in qt)
{
sw.WriteLine(el);
}
qt.Clear();
int i = nextLines;
while ((i-- > 0) && (line = sr.ReadLine()) != null)
{
if (line.Contains(word)) i = nextLines;
sw.WriteLine(line);
}
} else if (qt.Count > 29) qt.Dequeue();
}
}
}
}
И скомпилируйте пакетный файл, подобный этому, опубликованный на моем GitHub в eltomjan \ ETEhomeTools \ CSharp \ Compile.bat
Вдохновение для этого поиска, найденное где-то здесь, вероятно:
setlocal enabledelayedexpansion enableextensions
set LIBS=
for %%x in (*.dll) do (
echo %%x|findstr ",">nul 2>&1
if errorlevel 1 (set LIBS=!LIBS!,%%x) else (set LIBS=!LIBS!,"%%x")
)
if "%LIBS%"=="" (for /F %%v in ('dir /s %WINDIR%\Microsoft.NET\csc.exe /B') do echo %%v -debug %%* > cscLatest.bat ) else (for /F %%v in ('dir /s %WINDIR%\Microsoft.NET\csc.exe /B') do echo %%v -debug /r:%LIBS:~1% %%* > cscLatest.bat )
if "%1" == "" cscLatest.bat *.cs
cscLatest.bat %*
Если вы не хотите искать какую-либо версию CSC в папках Windows.