Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

bat поиск слова в файле
Goto page 1, 2  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
EN88



Joined: 05 Jun 2011
Posts: 6

Post (Separately) Posted: Sun Jun 05, 2011 11:40    Post subject: bat поиск слова в файле Reply with quote

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

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

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

Cпасибо.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Sun Jun 05, 2011 13:57    Post subject: Reply with quote

Обычный поиск по маске *.bat > c текстом > файлы не содержащие этот текст. После нахождения и вывода на панель можно делать, что душе угодно (копировать/перемещать/удалять).
Либо создаётся шаблон с этими условями поиска и при копировании всего выделенного по F5 в качестве фильтра вставляется имя шаблона в поле "Только файлы типа" (можно выбрать из выпадающего списка).
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2584
Location: Большая деревня Москва

Post (Separately) Posted: Sun Jun 05, 2011 14:08    Post subject: Reply with quote

Задача поставлена безграмотно, и, возможно, решение Flasher'а не годится: его нельзя уложить в один клик. EN88, попробуй поиграться с командой find:
Code:
FIND [/V] [/C] [/N] [/I] "строка" [[диск:][путь]имя_файла[ ...]]
Почитать о ней можно хотя бы здесь, да и в любом зхорошем справочнике по DOS.
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Sun Jun 05, 2011 14:10    Post subject: Reply with quote

Вахмурка wrote:
его нельзя уложить в один клик
Про один клик не было написано. И в любом случае одной команды find для единственного клика недостаточно. Так что, возможно, и твой вариант пока тоже не годится.
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2584
Location: Большая деревня Москва

Post (Separately) Posted: Sun Jun 05, 2011 14:29    Post subject: Reply with quote

Quote:
одной команды find для единственного клика недостаточно
Это правда, но команду можно вставить в батник с параметрами, например,
Code:
%P %T слово
Тогда кликом будет команда на исполнение батника.
В-общем, пока вопрошающий не подаст голос, мы все равно ничего не поймем.
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Sun Jun 05, 2011 14:41    Post subject: Reply with quote

Вахмурка 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
View user's profile Send private message
EN88



Joined: 05 Jun 2011
Posts: 6

Post (Separately) Posted: Sun Jun 05, 2011 16:06    Post subject: Reply with quote

Поторопился.
Задание, как оно есть:
написать командный файл, выполняющий следующие действия:
- создать каталог с названием 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
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2584
Location: Большая деревня Москва

Post (Separately) Posted: Sun Jun 05, 2011 16:28    Post subject: Reply with quote

Ага, значит, ты батникописец. То есть с командами DOS, например, find, на короткой ноге. Так за чем дело стало? Короче, повторю ссылку на свой пост.
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
EN88



Joined: 05 Jun 2011
Posts: 6

Post (Separately) Posted: Sun Jun 05, 2011 16:44    Post subject: Reply with quote

Спасибо, но find ищет в именах файлов. Мне нужно внутри. Вот в чём проблема. Или просто я тормоз.
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2584
Location: Большая деревня Москва

Post (Separately) Posted: Sun Jun 05, 2011 17:03    Post subject: Reply with quote

Вот цитата отсюда:
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
View user's profile Send private message
EN88



Joined: 05 Jun 2011
Posts: 6

Post (Separately) Posted: Sun Jun 05, 2011 17:13    Post subject: Reply with quote

Спасибо. А как передать имена файлов НЕ содержащих for для копирования?
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2584
Location: Большая деревня Москва

Post (Separately) Posted: Sun Jun 05, 2011 17:27    Post subject: Reply with quote

Ключ /v команды find обращает поиск (типа "не")... А ты батник точно сам писал? Wink
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
EN88



Joined: 05 Jun 2011
Posts: 6

Post (Separately) Posted: Sun Jun 05, 2011 17:44    Post subject: Reply with quote

Нет Smile

Quote:
/v Displays all lines that do not contain the specified <String>.

Строки выводит. А мне имена файлов нужны.
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Sun Jun 05, 2011 19:10    Post subject: Reply with quote

В цикле для каждого файла выполняешь команду:
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
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Mon Jun 06, 2011 00:00    Post subject: Reply with quote

Code:
for /f "delims=" %%a in ('findstr /vimsrc:"\<for\>" c:\*.bat') do copy "%%~fa" kuda-to\
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group