bat поиск слова в файле

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

EN88
Сообщения: 6
Зарегистрирован: Вс июн 05, 2011 11:37

bat поиск слова в файле

Сообщение EN88 »

Добрый день, помогите пожалуйста решить задачу.

Нужно копировать *.bat файлы из одной папки в другую. При этом файлы внутри которых встречается слово X должны игнорироваться.

Понятия не имею, как это сделать. Мучаюсь со вчерашнего дня.

Cпасибо.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Обычный поиск по маске *.bat > c текстом > файлы не содержащие этот текст. После нахождения и вывода на панель можно делать, что душе угодно (копировать/перемещать/удалять).
Либо создаётся шаблон с этими условями поиска и при копировании всего выделенного по F5 в качестве фильтра вставляется имя шаблона в поле "Только файлы типа" (можно выбрать из выпадающего списка).
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

Задача поставлена безграмотно, и, возможно, решение Flasher'а не годится: его нельзя уложить в один клик. EN88, попробуй поиграться с командой find:

Код: Выделить всё

FIND [/V] [/C] [/N] [/I] "строка" [[диск:][путь]имя_файла[ ...]]
Почитать о ней можно хотя бы здесь, да и в любом зхорошем справочнике по DOS.
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Вахмурка писал(а):его нельзя уложить в один клик
Про один клик не было написано. И в любом случае одной команды find для единственного клика недостаточно. Так что, возможно, и твой вариант пока тоже не годится.
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

одной команды find для единственного клика недостаточно
Это правда, но команду можно вставить в батник с параметрами, например,

Код: Выделить всё

%P %T слово
Тогда кликом будет команда на исполнение батника.
В-общем, пока вопрошающий не подаст голос, мы все равно ничего не поймем.
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Вахмурка писал(а):Это правда, но команду можно вставить в батник с параметрами, например,
Я просто не понял, в какой батник, и где, собственно, команда copy? Или всё это вопрошающий должен знать по умолчанию (видимо, точно так же, как c vbs, PP и т.д.)?

Если шаблон создан, то можно использовать такой скрипт:

Код: Выделить всё

' Копировать выделенное по шаблону в другую панель
' Параметры: "<Имя шаблона>"
'====================================
With CreateObject("TCScript.Helper")
T=.GetTextFromClip
.SetTextToClip(">"&WScript.Arguments(0))
.SendKeystroke "{F5}{TAB}^V~"
.SetTextToClip(T)
End With
Последний раз редактировалось Flasher Вс июн 05, 2011 18:05, всего редактировалось 1 раз.
EN88
Сообщения: 6
Зарегистрирован: Вс июн 05, 2011 11:37

Сообщение EN88 »

Поторопился.
Задание, как оно есть:
написать командный файл, выполняющий следующие действия:
- создать каталог с названием dir<дата>, где дата - дата, кот была 50000 дней назад от текущей.
- в каталог dir<дата> скопировать все файлы компьютера с расширением *.bat, но не содержащие слова "for".
- результат работы, количество скопированных файлов и их названия, записать в журнальный файл report.log
- заархивировать содержимое каталога dir<дата> программой winrar с ключами:
формат zip
имя с использованием даты
после архивации исходники удалить
не включать файлы с размером (более 500 б) //менее 1,5мб
- результат работы, кол-во заархивированых файлов и их названия, дописать в лог

Кривой код, который работает, но для for там условия нет:
(date.bat определяет дату -50000 дней назад)

Код: Выделить всё

@ECHO OFF
ECHO.
IF NOT "%OS%"=="Windows_NT" GOTO :EOF  
SET ERROR=0
::date
for /f "skip=3 tokens=4,5,6 delims=. " %%a in ('call c:\RGZ\work\date.bat -50000 ^| find /v "(" ') do (
set dd=%%a
set mm=%%b
set yyyy=%%c
)


set yy=%yyyy:~2,2%

set cdate=%dd%%mm%%yy%
set cdir=dir%cdate%
if not exist %cdir% mkdir %cdir%
echo ======%cdir% CREATED======
::копируем
xcopy c:\RGZ\work\rgz\*.bat c:\RGZ\work\rgz2\temp
dir c:\RGZ\work\rgz2\temp /a:-d /s /b >_temp.txt
for /f %%a in ('type _temp.txt') do (
for /f "tokens=5 delims=. " %%b in (' dir %%a /-c ^| findstr /R /B /C:"[0-9]*\.[0-9]*"') do (
call :ras %%b %%a
)
)

set rez=c:\RGZ\work\rgz2\report1.log
dir %cdir% /b /-x > %rez%
set /a count=0
for /r c:\RGZ\work\rgz2\%cdir% %%b in (*.*) do (
set /a count+=1
)
echo ________________________________________ >> %rez%
echo Количество скопированных файлов: %count% >> %rez%
echo ________________________________________ >> %rez%


SET /a count2=0
dir c:\RGZ\work\rgz2\%cdir%\*.bat /a /b /s > arch.txt
for /f %%a in ('type arch.txt') do ( 
for /f "tokens=1,3,4 delims= " %%b in ('dir %%a /-c ^| findstr /R /B /C:"[0-9]*\.[0-9]*\."') do (
if %%c LSS 500 (
echo %%a >> report2.log 
c:\progra~1\winrar\winrar.exe a -afzip -r -o+ -ep -df -agDDMMYY arhiv_ %%a 
echo %%b >> report2.log
SET /a count2+=1
)
)
)


echo ________________________________________ >> report2.log
echo Количество заархивированных файлов: %count2% >> report2.log
echo ________________________________________ >> report2.log
copy report1.log+report2.log report.log

::чистка
del /q C:\RGZ\work\rgz2\temp
rd  /q C:\RGZ\work\rgz2\temp
del /q C:\RGZ\work\rgz2\_temp.txt
del /q C:\RGZ\work\rgz2\arch.txt
del /q C:\RGZ\work\rgz2\report1.log
del /q C:\RGZ\work\rgz2\report2.log

goto:eof
:ras
set size=%1
set fname=%2
if %size% LEQ 1048576 (
copy %fname% c:\RGZ\work\rgz2\%cdir%
echo %fname% >> report1.log
)
goto:eof
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

Ага, значит, ты батникописец. То есть с командами DOS, например, find, на короткой ноге. Так за чем дело стало? Короче, повторю ссылку на свой пост.
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
EN88
Сообщения: 6
Зарегистрирован: Вс июн 05, 2011 11:37

Сообщение EN88 »

Спасибо, но find ищет в именах файлов. Мне нужно внутри. Вот в чём проблема. Или просто я тормоз.
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

Вот цитата отсюда:
If you want to search for a set of files, you can use the find command within the for command. To search the current directory for files that have the extension .bat and that contain the string "PROMPT", type:

for %f in (*.bat) do find "PROMPT" %f
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
EN88
Сообщения: 6
Зарегистрирован: Вс июн 05, 2011 11:37

Сообщение EN88 »

Спасибо. А как передать имена файлов НЕ содержащих for для копирования?
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

Ключ /v команды find обращает поиск (типа "не")... А ты батник точно сам писал? ;)
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
EN88
Сообщения: 6
Зарегистрирован: Вс июн 05, 2011 11:37

Сообщение EN88 »

Нет :)
/v Displays all lines that do not contain the specified <String>.
Строки выводит. А мне имена файлов нужны.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

В цикле для каждого файла выполняешь команду:

Код: Выделить всё

find [/i] "for" "filename">nul
И сразу после неё в том же цикле проверяешь код возврата errorlevel - в зависимости от того, был ли найден текст в файле, результат будет различным (0, если найден, и 1, если не найден):

Код: Выделить всё

if not errorlevel 1 игнорим_файл
иначе_копируем
Условие errorlevel 1 истинно, если errorlevel больше либо равна 1, поэтому для проверки значения 0 нужно проверять условие not errorlevel 1.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Код: Выделить всё

for /f "delims=" %%a in ('findstr /vimsrc:"\<for\>" c:\*.bat') do copy "%%~fa" kuda-to\
Ответить