View previous topic :: View next topic |
Author |
Message |
EN88
Joined: 05 Jun 2011 Posts: 6
|
(Separately) Posted: Sun Jun 05, 2011 11:40 Post subject: bat поиск слова в файле |
|
|
Добрый день, помогите пожалуйста решить задачу.
Нужно копировать *.bat файлы из одной папки в другую. При этом файлы внутри которых встречается слово X должны игнорироваться.
Понятия не имею, как это сделать. Мучаюсь со вчерашнего дня.
Cпасибо. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sun Jun 05, 2011 13:57 Post subject: |
|
|
Обычный поиск по маске *.bat > c текстом > файлы не содержащие этот текст. После нахождения и вывода на панель можно делать, что душе угодно (копировать/перемещать/удалять).
Либо создаётся шаблон с этими условями поиска и при копировании всего выделенного по F5 в качестве фильтра вставляется имя шаблона в поле "Только файлы типа" (можно выбрать из выпадающего списка). |
|
Back to top |
|
|
Вахмурка
Joined: 27 Dec 2004 Posts: 2584 Location: Большая деревня Москва
|
(Separately) Posted: Sun Jun 05, 2011 14:08 Post subject: |
|
|
Задача поставлена безграмотно, и, возможно, решение Flasher'а не годится: его нельзя уложить в один клик. EN88, попробуй поиграться с командой find: Code: | FIND [/V] [/C] [/N] [/I] "строка" [[диск:][путь]имя_файла[ ...]] | Почитать о ней можно хотя бы здесь, да и в любом зхорошем справочнике по DOS. _________________ Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон) |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sun Jun 05, 2011 14:10 Post subject: |
|
|
Вахмурка wrote: | его нельзя уложить в один клик | Про один клик не было написано. И в любом случае одной команды find для единственного клика недостаточно. Так что, возможно, и твой вариант пока тоже не годится. |
|
Back to top |
|
|
Вахмурка
Joined: 27 Dec 2004 Posts: 2584 Location: Большая деревня Москва
|
(Separately) Posted: Sun Jun 05, 2011 14:29 Post subject: |
|
|
Quote: | одной команды find для единственного клика недостаточно | Это правда, но команду можно вставить в батник с параметрами, например,Тогда кликом будет команда на исполнение батника.
В-общем, пока вопрошающий не подаст голос, мы все равно ничего не поймем. _________________ Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон) |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sun Jun 05, 2011 14:41 Post subject: |
|
|
Вахмурка wrote: | Это правда, но команду можно вставить в батник с параметрами, например, | Я просто не понял, в какой батник, и где, собственно, команда copy? Или всё это вопрошающий должен знать по умолчанию (видимо, точно так же, как c vbs, PP и т.д.)?
Если шаблон создан, то можно использовать такой скрипт:
Code: | ' Копировать выделенное по шаблону в другую панель
' Параметры: "<Имя шаблона>"
'====================================
With CreateObject("TCScript.Helper")
T=.GetTextFromClip
.SetTextToClip(">"&WScript.Arguments(0))
.SendKeystroke "{F5}{TAB}^V~"
.SetTextToClip(T)
End With |
Last edited by Flasher on Sun Jun 05, 2011 18:05; edited 1 time in total |
|
Back to top |
|
|
EN88
Joined: 05 Jun 2011 Posts: 6
|
(Separately) Posted: Sun Jun 05, 2011 16:06 Post subject: |
|
|
Поторопился.
Задание, как оно есть:
написать командный файл, выполняющий следующие действия:
- создать каталог с названием dir<дата>, где дата - дата, кот была 50000 дней назад от текущей.
- в каталог dir<дата> скопировать все файлы компьютера с расширением *.bat, но не содержащие слова "for".
- результат работы, количество скопированных файлов и их названия, записать в журнальный файл report.log
- заархивировать содержимое каталога dir<дата> программой winrar с ключами:
формат zip
имя с использованием даты
после архивации исходники удалить
не включать файлы с размером (более 500 б) //менее 1,5мб
- результат работы, кол-во заархивированых файлов и их названия, дописать в лог
Кривой код, который работает, но для for там условия нет:
(date.bat определяет дату -50000 дней назад)
Code: | @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 |
|
|
Back to top |
|
|
Вахмурка
Joined: 27 Dec 2004 Posts: 2584 Location: Большая деревня Москва
|
|
Back to top |
|
|
EN88
Joined: 05 Jun 2011 Posts: 6
|
(Separately) Posted: Sun Jun 05, 2011 16:44 Post subject: |
|
|
Спасибо, но find ищет в именах файлов. Мне нужно внутри. Вот в чём проблема. Или просто я тормоз. |
|
Back to top |
|
|
Вахмурка
Joined: 27 Dec 2004 Posts: 2584 Location: Большая деревня Москва
|
(Separately) Posted: Sun Jun 05, 2011 17:03 Post subject: |
|
|
Вот цитата отсюда: Quote: | 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
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон) |
|
Back to top |
|
|
EN88
Joined: 05 Jun 2011 Posts: 6
|
(Separately) Posted: Sun Jun 05, 2011 17:13 Post subject: |
|
|
Спасибо. А как передать имена файлов НЕ содержащих for для копирования? |
|
Back to top |
|
|
Вахмурка
Joined: 27 Dec 2004 Posts: 2584 Location: Большая деревня Москва
|
|
Back to top |
|
|
EN88
Joined: 05 Jun 2011 Posts: 6
|
(Separately) Posted: Sun Jun 05, 2011 17:44 Post subject: |
|
|
Нет
Quote: | /v Displays all lines that do not contain the specified <String>. |
Строки выводит. А мне имена файлов нужны. |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Sun Jun 05, 2011 19:10 Post subject: |
|
|
В цикле для каждого файла выполняешь команду:
Code: | find [/i] "for" "filename">nul |
И сразу после неё в том же цикле проверяешь код возврата errorlevel - в зависимости от того, был ли найден текст в файле, результат будет различным (0, если найден, и 1, если не найден):
Code: | if not errorlevel 1 игнорим_файл
иначе_копируем |
Условие errorlevel 1 истинно, если errorlevel больше либо равна 1, поэтому для проверки значения 0 нужно проверять условие not errorlevel 1. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
|
Tol!k
Joined: 01 Apr 2008 Posts: 1727 Location: Арзамас
|
(Separately) Posted: Mon Jun 06, 2011 00:00 Post subject: |
|
|
Code: | for /f "delims=" %%a in ('findstr /vimsrc:"\<for\>" c:\*.bat') do copy "%%~fa" kuda-to\ |
|
|
Back to top |
|
|
|