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

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

Vi3aliy 01-11-2015 21:54 2570543

Поиск, замена текста в *.txt и вывод результата в другой каталог
 
Здравствуйте. Помогите создать батник который производит поиск в папке файлов *.txt. В них ищем, допустим, "не готов" и меняем на "отправлен", и сохраняем результат в другую папку с тем же именем, если есть такой файл с таким именем - заменяем его без подтверждения... понятия не имею как сделать это. В тексте могут встречаться символы [] # *** . Помогите плз.

Пример
до

Не готов hghgjhjgjg# 35464747лалалл
апаррпопопо [9f8d7d6d5s4s]
hghghgj*****kgkgk

Не готов hghgjhjgjg# 3876556564лалалл
апаррпопопо [6н7у8вл8]
hghghgj*****ыспыва

после

отправлен hghgjhjgjg# 35464747лалалл
апаррпопопо [9f8d7d6d5s4s]
hghghgj*****kgkgk

отправлен hghgjhjgjg# 3876556564лалалл
апаррпопопо [6н7у8вл8]
hghghgj*****ыспыва

Iska 02-11-2015 00:26 2570581

Цитата:

Цитата Vi3aliy
поиск в папке файлов *.txt. В них ищем, допустим, "не готов" »

Упакуйте образцы двух-трёх файлов в архив, каковой приложите к сообщению.

Georgio 02-11-2015 01:08 2570589

Код:


Код:

@echo off

>nul chcp 1251

set "source=C:\папка А"
set "destination=C:\папка Б"
set "pattern=*.txt"

>nul chcp 866

set "original=Не готов"
set "final=отправлен"

for /f "delims=" %%i in ('
 ^>.tmp cmd/v/c echo.!original!^& 2^>nul findstr/milg:.tmp "%source%\%pattern%"^& del .tmp
') do 2>nul (
 for /f %%j in ('^<"%%i" find/c /v ""') do <"%%i">"%destination%\%%~nxi" (
  for /l %%k in (1 1 %%j) do @(
  set x=& set/p x=& if defined x (
    for /f "delims=" %%l in ('cmd/v/c echo "!x:%original%=%final%!"') do @(
    echo.%%~l
    )
  ) else (
    echo.
  )
  )
 )
)

exit/b


.



Предупреждение:


1) пакетный файл с данным кодом ни в коем случае не сохраняйте в кодировке OEM-866;

2) в случае замены строки, содержащей буквы русского алфавита, чётко соблюдайте регистр этих букв при задании переменной "original" (например, если в Вашем тексте надо заменить фразу "Не готов", то надо писать именно "Не готов", а не "не готов".

Iska 02-11-2015 05:48 2570608

Цитата:

Цитата Georgio
1) пакетный файл с данным кодом ни в коем случае не сохраняйте в кодировке OEM-866; »

Никак Вы не хотите народ приобщать к разумному-доброму-вечному :).

Georgio 02-11-2015 08:02 2570622

Цитата:

Цитата Iska
Никак Вы не хотите народ приобщать к разумному-доброму-вечному :). »

Не виноватая я! Он сам пришёл! Да я уж не такой злодей, это опять она, команда "FINDSTR":diablo:, виновата:).

Vi3aliy 02-11-2015 21:30 2570855

Огромное спасибо. Все работает.
Насчет кодировки все понял, меняем (Не готов - Not ready и отправлен - has been sent)
Еще просьба - можно сделать поиск и во вложеных папках, и как то сделать чтобы переодически все повторялось(раз в час или полчаса)?

Iska 02-11-2015 21:36 2570859

Цитата:

Цитата Vi3aliy
и как то сделать чтобы переодически все повторялось(раз в час или полчаса)? »

Назначенные задания/Планировщик задач. Главное, чтоб обработанные файлы у Вас куда-то убирались из исходной папки.

Georgio 02-11-2015 22:10 2570871

Цитата:

Цитата Vi3aliy
... сделать поиск и во вложеных папках... »



Можно. Добавьте ключ "/S" для команды "FINDSTR":
Код:

^>.tmp cmd/v/c echo.!original!^& 2^>nul findstr/msilg:.tmp "%source%\%pattern%"^& del .tmp
.




Цитата:

Цитата Vi3aliy
... сделать чтобы переодически все повторялось(раз в час или полчаса)... »



Зациклить тоже можно. Но лучше делайте, как коллега Iska советует.

Vi3aliy 03-11-2015 21:46 2571265

Всё получилось.Спасибо.


Время: 13:31.

Время: 13:31.
© OSzone.net 2001-