Страница 1 из 2
bat поиск слова в файле
Добавлено: Вс июн 05, 2011 11:40
EN88
Добрый день, помогите пожалуйста решить задачу.
Нужно копировать *.bat файлы из одной папки в другую. При этом файлы внутри которых встречается слово X должны игнорироваться.
Понятия не имею, как это сделать. Мучаюсь со вчерашнего дня.
Cпасибо.
Добавлено: Вс июн 05, 2011 13:57
Flasher
Обычный поиск по маске *.bat > c текстом > файлы не содержащие этот текст. После нахождения и вывода на панель можно делать, что душе угодно (копировать/перемещать/удалять).
Либо создаётся шаблон с этими условями поиска и при копировании всего выделенного по F5 в качестве фильтра вставляется имя шаблона в поле "Только файлы типа" (можно выбрать из выпадающего списка).
Добавлено: Вс июн 05, 2011 14:08
Вахмурка
Задача поставлена безграмотно, и, возможно, решение
Flasher'а не годится: его нельзя уложить в один клик.
EN88, попробуй поиграться с командой find:
Код: Выделить всё
FIND [/V] [/C] [/N] [/I] "строка" [[диск:][путь]имя_файла[ ...]]
Почитать о ней можно хотя бы
здесь, да и в любом зхорошем справочнике по DOS.
Добавлено: Вс июн 05, 2011 14:10
Flasher
Вахмурка писал(а):его нельзя уложить в один клик
Про один клик не было написано. И в любом случае одной команды
find для единственного клика недостаточно. Так что, возможно, и твой вариант пока тоже не годится.
Добавлено: Вс июн 05, 2011 14:29
Вахмурка
одной команды find для единственного клика недостаточно
Это правда, но команду можно вставить в батник с параметрами, например,
Тогда кликом будет команда на исполнение батника.
В-общем, пока вопрошающий не подаст голос, мы все равно ничего не поймем.
Добавлено: Вс июн 05, 2011 14:41
Flasher
Вахмурка писал(а):Это правда, но команду можно вставить в батник с параметрами, например,
Я просто не понял, в какой батник, и где, собственно, команда
copy? Или всё это вопрошающий должен знать по умолчанию (видимо, точно так же, как c vbs, PP и т.д.)?
Если шаблон создан, то можно использовать такой скрипт:
Код: Выделить всё
' Копировать выделенное по шаблону в другую панель
' Параметры: "<Имя шаблона>"
'====================================
With CreateObject("TCScript.Helper")
T=.GetTextFromClip
.SetTextToClip(">"&WScript.Arguments(0))
.SendKeystroke "{F5}{TAB}^V~"
.SetTextToClip(T)
End With
Добавлено: Вс июн 05, 2011 16:06
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
Добавлено: Вс июн 05, 2011 16:28
Вахмурка
Ага, значит, ты батникописец. То есть с командами DOS, например, find, на короткой ноге. Так за чем дело стало? Короче, повторю
ссылку на свой пост.
Добавлено: Вс июн 05, 2011 16:44
EN88
Спасибо, но find ищет в именах файлов. Мне нужно внутри. Вот в чём проблема. Или просто я тормоз.
Добавлено: Вс июн 05, 2011 17:03
Вахмурка
Вот цитата
отсюда:
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
Добавлено: Вс июн 05, 2011 17:13
EN88
Спасибо. А как передать имена файлов НЕ содержащих for для копирования?
Добавлено: Вс июн 05, 2011 17:27
Вахмурка
Ключ /v команды find обращает поиск (типа "не")... А ты батник точно сам писал?

Добавлено: Вс июн 05, 2011 17:44
EN88
Нет
/v Displays all lines that do not contain the specified <String>.
Строки выводит. А мне имена файлов нужны.
Добавлено: Вс июн 05, 2011 19:10
MVV
В цикле для каждого файла выполняешь команду:
И сразу после неё в том же цикле проверяешь код возврата
errorlevel - в зависимости от того, был ли найден текст в файле, результат будет различным (0, если найден, и 1, если не найден):
Код: Выделить всё
if not errorlevel 1 игнорим_файл
иначе_копируем
Условие
errorlevel 1 истинно, если
errorlevel больше либо равна 1, поэтому для проверки значения 0 нужно проверять условие
not errorlevel 1.
Добавлено: Пн июн 06, 2011 00:00
Tol!k
Код: Выделить всё
for /f "delims=" %%a in ('findstr /vimsrc:"\<for\>" c:\*.bat') do copy "%%~fa" kuda-to\