Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   BAT поиск текста в файле с условием (http://forum.oszone.net/showthread.php?t=281668)

rosalin 30-04-2014 21:48 2345345

BAT поиск текста в файле с условием
 
Помогите с батничком
Необходимо чтобы батник проверял в папке все файлы которые там есть.
Файлы по сути текстовые, но лежат в формате *.msg
так вот нужно чтобы батник проверял присутствует в файле текст например "for <adm@" , если да , то этот файл нужно скопировать в папку adm если "for <info@" то этот файл нужно скопировать в папку info.
Но важно поиск с начала файла и по первой найденной строке потому как в файле могут быть обе строки "for <adm@" и "for <info@" важна именно первая найденная строка

Заранее премного благодарен!

Georgio 30-04-2014 23:49 2345434

Как-то так:

Код:

@echo off
for %%i in (*.msg) do (
 for /f "delims=" %%j in ('
  findstr /iln /c:"for <adm@" /c:"for <info@" "%%~i"^| findstr /b 1:
 ') do (
  echo "%%j"| >nul (findstr /ilc:"for <adm@"&& copy "%%~i" "adm"|| copy "%%~i" "info")
 )
)
exit /b

.

rosalin 04-05-2014 16:50 2347008

Да скрипт работает, но как быть если нужно добавить больше аргументов, например искать "for <adm@" "for <info@" "for <ivanov@" "for <petrov@" "for <sidorov@" что первое находит в ту папку и кладем adm info ivanov petrov и т.д.

Georgio 05-05-2014 00:11 2347058

Да не вопрос!


Цитата:

Цитата rosalin
что первое находит в ту папку и кладем »

Если такой папки не существует, то она будет создана.


Полная сортировка по заданному алгоритму:

Код:

@echo off
setlocal enabledelayedexpansion
for %%i in (*.msg) do (
 for /f "delims=" %%j in ('
  findstr /inrc:"for <.*@" "%%~i"^| findstr /b 1:
 ') do (
  set "string=%%j"
  set "string=!string:*for <=!"
  for /f "delims=@" %%k in ("!string!") do (
  md "%%k" 2>nul
  copy "%%~i" "%%k">nul
  )
 )
)
endlocal
exit /b

.

Georgio 05-05-2014 00:33 2347068

Цитата:

Цитата rosalin
как быть если нужно добавить больше аргументов, например искать "for <adm@" "for <info@" "for <ivanov@" "for <petrov@" "for <sidorov@" »



Еспи нужна выборочная сортировка с любым числом аргументов, то тогда так:

Код:

@echo off
call:# "adm" "info" "ivanov" "petrov" "sidorov"
exit /b

:#
for %%i in (*.msg) do (
 for /f "delims=" %%j in ('
  findstr /inrc:"for <.*@" "%%~i"^| findstr /b 1:
 ') do (
  for %%k in (%*) do call:## "%%j" %%k "%%~i"
 )
)
exit /b

:##
echo %1| >nul (
findstr /ilc:"for <%~2@"&& (
md %2 2>&1
copy %3 %2
))
exit /b

.

Если нужные папки не существуют, то они будут созданы.

rosalin 05-05-2014 00:46 2347075

Ребята протестил на реальном файле не сработало

вот структурка

Код:

Return-path: <adm@domain.ru>
Received: from SERVER1C bydomain.ru ()
        with ESMTP id 60-md50000009510.msg
        for <adm@

структура как есть с пробелами

rosalin 05-05-2014 01:14 2347080

не срабатывает если перед искомой строкой есть любой текст или просто несколько пустых строк

Georgio 05-05-2014 08:16 2347136

rosalin, нашёл и устранил проблему. Привожу отредактированный код для обоих пакетных файлов.

Код:

@echo off
setlocal enabledelayedexpansion
for %%i in (*.msg) do (
 for /f "delims=" %%j in ('
  findstr /irc:"for <.*@" "%%~i"^| findstr /n "^"^| findstr /b 1:
 ') do (
  set "string=%%j"
  set "string=!string:*for <=!"
  for /f "delims=@" %%k in ("!string!") do (
  md "%%k" 2>nul
  copy "%%~i" "%%k">nul
  )
 )
)
endlocal
exit /b

Код:

@echo off
call:# "adm" "info" "ivanov" "petrov" "sidorov"
exit /b

:#
for %%i in (*.msg) do (
 for /f "delims=" %%j in ('
  findstr /irc:"for <.*@" "%%~i"^| findstr /n "^"^| findstr /b 1:
 ') do (
  for %%k in (%*) do call:## "%%j" %%k "%%~i"
 )
)
exit /b

:##
echo %1| >nul (
findstr /ilc:"for <%~2@"&& (
md %2 2>&1
copy %3 %2
))
exit /b


rosalin 05-05-2014 09:02 2347139

Georgio , круто! А как второй скрипт надо запускать с параметром ?

Georgio 05-05-2014 09:34 2347153

Цитата:

Цитата rosalin
А как второй скрипт надо запускать с параметром ? »


С помощью командной строки или запускающего пакетного файла:
Код:

"somename.bat" "adm" "info" "ivanov" "petrov" "sidorov"
, предварительно убрав из кода вторую и третью строки:
Код:

call:# "adm" "info" "ivanov" "petrov" "sidorov"
exit /b

.

rosalin 05-05-2014 14:56 2347302

скрипт работает разобрался, спасибо!


Время: 20:40.

Время: 20:40.
© OSzone.net 2001-