Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Задачи на bat-файлах 8

Автор: king_stiven
Дата сообщения: 15.06.2010 16:01
joker56
то есть если размер LOG-файла меньше 1 kb то одно действие, если больше или равно то другое? Или надо сначала узнать размер LOG-файла и принять его за константу и отслеживать больше или меньше ? Также можно в этом логе искать слово и по его наличию действие.
Автор: res2001
Дата сообщения: 15.06.2010 16:04
joker56
Набросал батник. Отслеживает изменения размера указанного файла.
Соответственно добавь в нужных местах вызовы своих exe.

Код: @echo off
set "scandir=d:\1"
set "fname=test.log"
set "fsave=save.dat"
set /p save=<%fsave%
for /F "tokens=1-5" %%a in ('dir /-c %scandir% ^| findstr %fname%') do (
    if "%save%"=="%%c" (
        echo файл не изменился
    ) else (
        echo файл изменился
        echo.%%c>%fsave%
    )
)
Автор: wolf0425
Дата сообщения: 15.06.2010 16:16
joker56
Цитата:
Из bat-файла нужно периодически анализировать изменение размера папки и в результате этого осуществлять переход на вызов одного или другого EXE-файла, уже находящих на компьютере. Похоже строк не много, но я практически не владею синтаксисом, может кто-нибудь помочь?
по постановке - может все не размер папки отслеживать, а размер самого файла?
отслеживать именно размер папки тоже можно, но тебе вроде незачем.

вот, должно каждые 10 сек проверять не изменилась ли длина файла лога за прошедшее время.
Если считаешь что пауза велика - сделай покороче, такой цикл совсем без паузы тебе наверно не нужен :)

Код: @echo off
call :_size "c:\1\your file.log"

:loop
set "_oldsize=%_newsize%"
call :_size "c:\1\your file.log"
if %_oldsize% neq %_newsize% echo different & goto :loop
echo :equal
ping localhost -n 11 >nul
goto :loop

:_size
set /a _newsize=%~z1 +0
exit /b
Автор: res2001
Дата сообщения: 15.06.2010 16:31
wolf0425
пинг надо в начало цикла влепить, иначе в случае different задержки не происходит
Автор: wolf0425
Дата сообщения: 15.06.2010 16:38

Цитата:
иначе в случае different задержки не происходит
да я его специально только в ветку equal перенес, считая что изменяется файл не очень то часто.
может и неправ, сильно зависит от того для чего конкретно отслеживается размер.
Автор: res2001
Дата сообщения: 15.06.2010 16:51
wolf0425
joker56у то надо запускать какие-то обработчики видимо, в таком виде получится что один за одним запустится обработчик изменений и обработчик отсутствия изменений, а это скорее всего не есть хорошо, они могут и конфликтовать начать с дуру.
Конечно можно startом запускать с ожиданием, но похоже joker56 с этим не совладает
Отличный у тебя способ нахождения размера файла, я не додумался так сделать
С диром, канечна, изврат.
Автор: wolf0425
Дата сообщения: 15.06.2010 18:05

Цитата:
joker56у то надо запускать какие-то обработчики видимо, в таком виде получится что один за одним запустится обработчик изменений и обработчик отсутствия изменений, а это скорее всего не есть хорошо, они могут и конфликтовать начать с дуру.
да я как-то надеюсь что батник ждет окончания обработки в обоих случаях, и никуда не идет.
так что всегда работает либо один из обработчиков либо батник.
так что вопрос нужности паузы после обработки обнаружения изменений - пусть joker56 сам решает, тему читать вообще невредно.

Цитата:
Конечно можно startом запускать с ожиданием, но похоже joker56 с этим не совладает
да научим, если спросит.
не факт вообще что обработчики отдельным процессом запускаются, а не такие же консольные.

Цитата:
Отличный у тебя способ нахождения размера файла, я не додумался так сделать
можно вместо call решить через for, писанины примерно столько же.
просто с call можно сразу какую-то обработку влепить, не страдая от ограничений на %переменные%
только тут с for пришлось бы делать отдельный код для случая исчезновения файла
Автор: igor_andreev
Дата сообщения: 16.06.2010 00:06
Работает у кого-нибудь? *тут ржущий смайлик*
http://bolknote.ru/2010/06/13/~2566

А то у меня nslookup не проходит толком(из-за маршрутизатора на 192.168.0.1 что-ли?)

Цитата:
*** Can't find server name for address 192.168.0.1: Timed out
*** Default servers are not available

Пару строчек гимна только выдал разок.
Автор: wolf0425
Дата сообщения: 16.06.2010 00:51

Цитата:
А то у меня nslookup не проходит толком(из-за маршрутизатора на 192.168.0.1 что-ли?)
а что маршрутизатор? проблема скорее в сервере dns, у меня гугл - после энного прогона таки начал выдавать текст без ошибок.
Автор: res2001
Дата сообщения: 16.06.2010 08:04
igor_andreev
работает
Автор: barsikline
Дата сообщения: 16.06.2010 08:24
Почему используя ftp.exe при попытке сменить каталог (cd) имя которого заканчивается на букву "Я" - пишет, что такой каталог не найден!? Чё делать?
Автор: res2001
Дата сообщения: 16.06.2010 08:28
barsikline
а какой ftp сервер используешь?
Может у него хронические проблемы с русскими каталогами/файлами.

Добавлено:
попробуй другим ftp клиентом, например far или total. Надо определить на чьей стороне проблема клиента или сервера.
Автор: wolf0425
Дата сообщения: 16.06.2010 09:10
barsikline
Цитата:
Почему используя ftp.exe при попытке сменить каталог (cd) имя которого заканчивается на букву "Я" - пишет, что такой каталог не найден!? Чё делать?
переключаться в кодировку 1251 заранее, батник тоже сохранять в виндовой. примерно так:

Код: @echo off
chcp 1251
(echo user anonymous anonymous
echo ls
echo cd "/Инструкция/"
echo pwd
echo bin
echo get file.tst
) | ftp -n localhost
Автор: yahan2
Дата сообщения: 16.06.2010 09:45
Подскажите как получить код завершения первой команды, если ее вывод передается другой?
Например, если есть такая конструкция:

Код: 7za.exe a 1.ZIP C:\WORK | tee -a mybackup.log
if errorlevel 1 goto err_arch
Автор: res2001
Дата сообщения: 16.06.2010 09:48
yahan2
ну значит надо команды разделять, вывод первой записывать в промежуточный файл, проверять errorlevel, а потом файл подавать на вход второй.
Как то так:

Код: 7za.exe a 1.ZIP C:\WORK >temp.log
if errorlevel 1 goto err_arch
type temp.log | tee -a mybackup.log
Автор: yahan2
Дата сообщения: 16.06.2010 10:01
res2001
Разделять не интересно, дело в том, что время архивации большого массива данных может занимать достаточно много времени. Надо видеть что происходит в данный момент и одновременно создавать лог в файл (что и делает tee).

Если делать вашим методом, то вначале происходит архивация, а потом содержимое лога быстро вываливается на экран.

Как вариант вижу - анализ результирующего лога с помощью find, но это как-то через одно место, не надежно и медленно, хотелось бы просто проверить код ошибки архиватора.
Автор: res2001
Дата сообщения: 16.06.2010 10:41
yahan2
А что если архивацию выделить в отдельный батник. После архивации в этом батнике вывести errorlevel.
Тогда вызов в родительском бат будет такой:
call arc.bat | tee -a mybackup.log
а потом уже findом ищем вхождение в лог файле errorlevel.

Добавлено:
можно выделять не в батник, а оформить процедурой.
Автор: wolf0425
Дата сообщения: 16.06.2010 10:58

Цитата:
Подскажите как получить код завершения первой команды, если ее вывод передается другой?
код - вроде никак, ошибку отловить - типа так:

Код: (7za.exe a 1.ZIP C:\WORK || cd . 2>err.flag )| tee -a mybackup.log
if exist err.flag goto err_arch
Автор: res2001
Дата сообщения: 16.06.2010 11:25

Цитата:
да пофиг, из той процедуры переменную в родительское окружение не передашь просто так.

errorlevel запишется в лог и оттуда его можно выдернуть:


Код: @echo off
call :arh | tee -a mybackup.log
for /f "tokens=1 delims==" %%i ('find "ERRORLEVEL=" mybackup.log') do (
if %%i==0 ( echo Архивация успешна) else echo Ошибка архивации
)

:arh
"C:\Program Files\7-Zip\7z.exe" a test c:\work
echo ERRORLEVEL=%ERRORLEVEL%
exit /b
Автор: wolf0425
Дата сообщения: 16.06.2010 11:59

Цитата:
errorlevel запишется в лог и оттуда его можно выдернуть:
вот только tee -a - это запись лога с аппендом, так что выдернешь ты более одной строки ERRORLEVEL... и это может быть небыстрым.

А неужели у тебя приведенный тобою код - работает???
вызов 7z можешь для теста заменить на что-то , например на dir \\\
Автор: res2001
Дата сообщения: 16.06.2010 12:07
wolf0425
код не рабочий, у меня не было tee для отладки.
Сейчас нашел, поотлаживаю.
Автор: wolf0425
Дата сообщения: 16.06.2010 12:09

Цитата:
код не рабочий, у меня не было tee для отладки.
да там не в tee затык,
а в том что call :label | anyprogram.exe - работать не будет, так как :label - не команда
и ещё пара ошибок в синтаксисе for ...

и чем гемороиться со сканированием лога - проще флаговый файлик создать, пример на прошлой странице.
Автор: res2001
Дата сообщения: 16.06.2010 12:19
wolf0425
согласен и с меткой и с ошибками в коде.
С дополнительным батником работает, проверил:

test.bat:

Код: @echo off
call test1.bat | wtee mybackup.log
for /f "usebackq tokens=2 delims==" %%i in (`find "ERRORLEVEL=" mybackup.log`) do (
echo %%i
if %%i==0 ( echo Архивация успешка) else echo Ошибка архивации
)
Автор: wolf0425
Дата сообщения: 16.06.2010 12:39

Цитата:
С дополнительным батником работает, проверил:
ну вот ещё бы for переделал чтоб был совместим с tee -a...
и потом сравнил количество геморроя с простым файловым флагом

Код: (7za.exe a 1.ZIP C:\WORK || cd . 2>err.flag )| tee -a mybackup.log
if exist err.flag del err.flag & echo goto :err_arch
Автор: res2001
Дата сообщения: 16.06.2010 12:43
wolf0425

Цитата:
Надо видеть что происходит в данный момент и одновременно создавать лог в файл (что и делает tee).

По моему мы оба не много не правы. yahan2 хочет чтоб во время архивации, все что 7z выдает он видел на экране с одновременным помещением в файл и вытаскиванием в конце errorlevel.
В наших вариантах во время работы 7z на экран ничего выдаваться не будет, все сообщения 7z вылезут только когда за них возьмется tee, т.е. фактически после создания архива.
Автор: wolf0425
Дата сообщения: 16.06.2010 12:44

Цитата:
В наших вариантах во время работы 7z на экран ничего выдаваться не будет, все сообщения 7z вылезут только когда за них возьмется tee, т.е. фактически после создания архива.
а проверить - не судьба что-ли? паузу влепи вместо 7z или дир длинного каталога.
Автор: res2001
Дата сообщения: 16.06.2010 12:44

Цитата:
и потом сравнил количество геморроя с простым файловым флагом

я уже сравнил.
Только зачем в варианте с флагом "cd ." - не понял.

Добавлено:
wolf0425

Цитата:
а проверить - не судьба что-ли? паузу влепи вместо 7z или дир длинного каталога.

только что проверял, запустил 7z на каталог с большим файлом - пока шла упаковка на экране ничего не было.
Автор: joker56
Дата сообщения: 16.06.2010 12:49
wolf0425
res2001
Какие вы все-таки замечательные люди, дай вам бог здоровья и всех благ.
Я попробовал оба варианта - в варианте Res'а ПРИ ИЗМЕНЕНИЯХ файла почему то выводятся оба сообщения - и Файл изменился и Файл не изменился.
В варианте Wolf'а но с советом Res'а перенести ping в начало цикла сразу после строчки :loop все работает в соответствии с заданием. К тому же, там я смогу изменять время задержки ( я правильно понял, что число 11 в строчке ping означает задержку в секундах?). Я прописал нужные мне исполнительные файлы (2.exe и 3.exe), все включается очень хорошо.

@Echo Off
call:_size "c:\1\test.log"

:loop
ping localhost -n 11>nul
set "_oldsize=%_newsize%"
call:_size "c:\1\test.log"
if %_oldsize% neq %_newsize% start c:\2.exe & goto :loop
start c:\3.exe
goto :loop

:_size
set /a _newsize=%~z1 +0
exit /b

Единственное, что мне нужно уточнить - следить придется не за размером одного файла test.log а за размером всей папки C:\1 потому что программа, за которой надо следить, может создавать в этой папке новые файлы *.log, а отслеживать их нет смысла, да и гораздо сложнее, и размер .bat тоже критичен. Как изменить текст с этой целью?
И еще - для своего развития - а где можно найти описания таких штучек, как % ^ | <> ~ и всяких слов типа ping localhost nul, которых нет в описаниях команд, выводимых при HELP <имя команды>?

Еще раз большой респект и уважуха
Автор: wolf0425
Дата сообщения: 16.06.2010 12:57

Цитата:
Только зачем в варианте с флагом "cd ." - не понял.
NOP такой.
нужна же какая-то команда чтоб файл создать. причем rem - не годится, а echo чего-то пишет в лог...

Цитата:
только что проверял, запустил 7z на каталог с большим файлом - пока шла упаковка на экране ничего не было.
а, есть такое. но это уже не к нам вопрос,
7za a -r0 xxx E:\MiniSV.iso | tee -a mybackup.log тоже выплевывает на экран по окончании запаковки. т.е. проблема в tee или в виндах.

Автор: res2001
Дата сообщения: 16.06.2010 13:08
wolf0425
Проблема в виндах, думаю. CMD, видимо, не многопоточный.
Интересно в этой связи - если вывод первой команды очень большой, то где винда его будет сохранять до того как подаст на вход второй команде. Так ведь можно и всю память израсходовать.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132

Предыдущая тема: XP не видит второй раздел на съемном USB-HDD


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.