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

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

Автор: wolf0425
Дата сообщения: 16.06.2010 13:40
joker56

Цитата:
( я правильно понял, что число 11 в строчке ping означает задержку в секундах?).
почти правильно - это число должно быть на 1 больше чем нужная величина задержки в секундах.
и поаккуратнее с пробелами -
ping localhost -n 11 >nul и ping localhost -n 11>nul
- не на всех системах сработают одинаково.
но тут ещё я виноват, надо было не лениться и сразу писать
1>nul ping localhost -n 11

Цитата:
Единственное, что мне нужно уточнить - следить придется не за размером одного файла test.log а за размером всей папки C:\1 потому что программа, за которой надо следить, может создавать в этой папке новые файлы *.log, а отслеживать их нет смысла, да и гораздо сложнее, и размер .bat тоже критичен. Как изменить текст с этой целью?

перейти к тому что предлагалось в начале и что делал Res
в отвязанном от региональных и языковых настроек варианте оно выглядит заметно более громоздко:

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

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

:_size
for /f "tokens=3*" %%a in ('dir "%~f0"') do set "dir_txt=%%b"
for /f "tokens=3" %%s in ('dir /a-d %1 ^| findstr /b /c:" " ^| find /v "%dir_txt%" ') do set "dir_txt=%%s"
for /f "delims=0123456789" %%a in ("%dir_txt% ") do 1>file.txt call set "_newsize=%%dir_txt:%%a=%%"
exit /b
Автор: res2001
Дата сообщения: 16.06.2010 13:46
joker56
В моем варианте возможен вывод нескольких сообщений в случае наличия в каталоге похожих файлов типа: test.log1 test.log2 и т.п.
Я подразумевал, что батник будет запускаться например через шедулер в нужное время с нужными интервалами, но можно прикрутить и цикл по аналогии с вариантом wolf0425.

На счет сканирования каталога - по моему вариант wolf0425 тут не прокатит, для каталога %~z1 все время возвращает 0.
В моем варианте - элементарно
Замени
for /F "tokens=1-5" %%a in ('dir /-c %scandir% ^| findstr %fname%') do (

на
for /F "tokens=1-5" %%a in ('dir /-c %scandir% ^| findstr "файлов"') do (

будет брать размер в выводе dir не конкретного файла, а итоговой строки для файлов


Цитата:
И еще - для своего развития - а где можно найти описания таких штучек, как % ^ | <> ~ и всяких слов типа ping localhost nul, которых нет в описаниях команд, выводимых при HELP <имя команды>?

Пуск->Помощь в строке поиска введи "перенаправление". Эти штуки называются операторами перенаправдения.

Добавлено:
joker56

Цитата:
в отвязанном от региональных и языковых настроек варианте оно выглядит заметно более громоздко:

Я бы не стал парится с отвязкой региональных настроек, потому что действительно очень громоздко. Ты же собираешься запускать этот батник на вполне конкретной системе с заранее известными региональными параметрами.
Автор: wolf0425
Дата сообщения: 16.06.2010 15:00
res2001
Цитата:
Цитата:
в отвязанном от региональных и языковых настроек варианте оно выглядит заметно более громоздко:
Я бы не стал парится с отвязкой региональных настроек, потому что действительно очень громоздко. Ты же собираешься запускать этот батник на вполне конкретной системе с заранее известными региональными параметрами.
да это не повод проверять/править текст батника при переносе на соседнюю систему, где dir /-c %scandir% | findstr "файлов" может запросто ничего не найти, когда эта возможная ошибка заранее устраняется одной строкой кода.
или внимательно исследовать код для выяснения - какой же там пробел вбит, обычный или неразрывный...
код в общем-то только выглядит страшненько, да и третий фор в данном случае только для красоты - он чтобы из строки число сделать. сравнивать на равенство можно и текст.


Автор: joker56
Дата сообщения: 16.06.2010 15:12
wolf0425
res2001
Друзья, ваш "объединенный" Wolf'ом вариант замечательно выполняет нужную задачу. Убрал \*.log и слово echo перед start. Вот результирующий код для интересующихся.

Задача:
Анализ 1 раз ~ в 10 сек
Если произошло изменение размера папки С:\1 то запускается файл C:\2.exe
Если не произошло изменение размера папки С:\1 то запускается файл C:\3.exe

Код ((с)Wolf0425 и res2001 ):

@echo off
call:_size "c:\1"

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

:_size
for /f "tokens=3*" %%a in ('dir "%~f0"') do set "dir_txt=%%b"
for /f "tokens=3" %%s in ('dir /s/a-d %1 ^| findstr /b /c:" " ^| find /v "%dir_txt%" ') do set "dir_txt=%%s"
for /f "delims=0123456789" %%a in ("%dir_txt% ") do 1>file.txt call set "_newsize=%%dir_txt:%%a=%%"
exit /b

Огромное спасибо!
Автор: res2001
Дата сообщения: 16.06.2010 15:17
joker56


wolf0425

Цитата:

Код: for /f "delims=0123456789" %%a in ("%dir_txt% ") do 1>file.txt call set "_newsize=%%dir_txt:%%a=%%"
Автор: wolf0425
Дата сообщения: 16.06.2010 15:20

Цитата:
Убрал \*.log
ну оставил бы хоть \*

держи укороченную версию чтоб res2001 меньше нудел

Код: @echo off
call:_size "c:\1"

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

:_size
for /f "tokens=3*" %%a in ('dir "%~f0"') do set "dir_txt=%%b"
for /f "tokens=3" %%s in ('dir /-c /s/a-d %1 ^| findstr /b /c:" " ^| find /v "%dir_txt%" ') do set "_newsize=%%s"
exit /b
Автор: res2001
Дата сообщения: 16.06.2010 15:34
wolf0425

Цитата:
ты ещё скажи что метод отвязки от findstr "файлов" неоригинальный

оригинальный зачет

Вот еще мысль по поводу флаг файла для yahan2:
вместо cd . можно присвоить значение переменной. И обойдемся тогда вообще без дополнительных файлов.

Код: ("C:\Program Files\7-Zip\7z.exe" a 1 d:\1 || set err=true )| wtee -a mybackup.log
if defined err (echo ERROR) else echo Ok
Автор: yahan2
Дата сообщения: 16.06.2010 17:22
res2001
wolf0425
Спасибо, большое за помощь, но tee или cmd сами по себе как-то странно работают в винде

"C:\Program Files\7-Zip\7z.exe" a 1 d:\1
и
"C:\Program Files\7-Zip\7z.exe" a 1 d:\1 | wtee -a mybackup.log

совершенно по разному делают вывод на экран, во втором случае он идет как-то порциями (выдал и завис, потом опять выдал...)
Придется отказаться от этой задумки.

Добавлено:
Еще один вопрос как проверить существование каталога?
Если на месте каталога находится файл - то мне надо отловить эту ситуацию

Я делаю так:
if exist C:\dir_name\nul echo is_dir

где C:\dir_name - имя проверяемого каталога.
На локальных дисках эта проверка работает, а на сетевых, если dir_name это файл, то код возвращает true
Автор: wolf0425
Дата сообщения: 16.06.2010 18:36
res2001

Цитата:
если в dir указать ключ /-c то разделителей в сумме не будет
да, чего-то я это место хэлпа пропустил.


Цитата:
Вот еще мысль по поводу флаг файла для yahan2:
вместо cd . можно присвоить значение переменной. И обойдемся тогда вообще без дополнительных файлов.
Код: ( dir \\\ || set err=true )| wtee -a mybackup.log
if defined err (echo ERROR) else echo Ok
Автор: barsikline
Дата сообщения: 17.06.2010 01:32
res2001

Цитата:
barsikline
а какой ftp сервер используешь?
Может у него хронические проблемы с русскими каталогами/файлами.

Добавлено:
попробуй другим ftp клиентом, например far или total. Надо определить на чьей стороне проблема клиента или сервера.

Через Total или Far все ок. Наверно ftp сервер кривой ).

wolf0425

Цитата:
переключаться в кодировку 1251 заранее, батник тоже сохранять в виндовой. примерно так:

Код:
@echo off
chcp 1251
(echo user anonymous anonymous
echo ls
echo cd "/Инструкция/"
echo pwd
echo bin
echo get file.tst
) | ftp -n localhost


Так пробывал - не помогает...
Автор: wolf0425
Дата сообщения: 17.06.2010 03:05
barsikline так все же - какой сервер то, и в какой кодировке с ним работают ФАР с тоталом?


Автор: barsikline
Дата сообщения: 17.06.2010 03:20
есть файл с текстом, к примеру:
01_текст текст текст
02_текст текст текст
03_текст текст текст
и т.д.

написал такой батник:
@echo off
chcp 1251
set /p lsd= < 05.txt
net send * %lsd:~18%
exit

при выполнении msg или net send берут только первую строчку из файла.
А как сделать так, чтобы команда msg или net send выводили весь текст из файла на экран?

Добавлено:
wolf0425

Цитата:
barsikline так все же - какой сервер то, и в какой кодировке с ним работают ФАР с тоталом?

ftp сервер Gene, а в какой кодировке не заню.
Автор: res2001
Дата сообщения: 17.06.2010 08:21
barsikline

Цитата:
ftp сервер Gene, а в какой кодировке не заню.

я у себя тестировал предложение wolf0425 по кодировке - отработало правильно, так как он и говорил. Надо чтоб файл сам у тебя был тоже в кодировке 1251 (в блокноте его открой, если русские буквы читабельные, значит 1251).


Цитата:
при выполнении msg или net send берут только первую строчку из файла.
А как сделать так, чтобы команда msg или net send выводили весь текст из файла на экран?

Поясни что ты хочешь получить. Ты хочешь net sendом разослать сообщение содержащееся в файле? Или каждая строчка файла представляет отдельное сообщение?
По моему логичен первый вариант, но, на сколько я знаю net send не может форматировать передаваемый текст (разделять его на строки).
Поэтому можно заставить передать весь твой файл как одну строку, прочитав из файла в цикле каждую строку и присвоив их переменной. У юзера будет выглядеть не очень симпатично, если файл достаточно длинный, но цели достигнешь К тому же наверняка у net send есть ограничение на длину передаваемой строки.

Код: @echo off
for /f "tokens=*" %%a in (05.txt) do call set msg=%%msg%% %%a
net send * %msg%
echo %msg%
Автор: barsikline
Дата сообщения: 17.06.2010 09:57
res2001

Цитата:
Поясни что ты хочешь получить. Ты хочешь net sendом разослать сообщение содержащееся в файле? Или каждая строчка файла представляет отдельное сообщение?
По моему логичен первый вариант, но, на сколько я знаю net send не может форматировать передаваемый текст (разделять его на строки).
Поэтому можно заставить передать весь твой файл как одну строку, прочитав из файла в цикле каждую строку и присвоив их переменной. У юзера будет выглядеть не очень симпатично, если файл достаточно длинный, но цели достигнешь К тому же наверняка у net send есть ограничение на длину передаваемой строки.

Код:
@echo off
for /f "tokens=*" %%a in (05.txt) do call set msg=%%msg%% %%a
net send * %msg%
echo %msg%


Спасибо. Но желательно чтобы выводилась в одном сообщении по строчкам как файле, а не все до кучи ). К стати размер сообщения действительно ограничен. Может подскажете как можно сделать так чтобы из всех строчек бралась та часть теста перед которой, к примеру стоит буква "в", или может ту которая начинатеся с "O:\", чтобы уменьшить строки.
например:
Файл скопирован в каталог O:\Копия\
Файл скопирован в каталог O:\Копия\
Файл скопирован в каталог O:\Копия\
и т.д.
короче отсечь "Файл скопирован в" и оставить "каталог O:\Копия\"

И еще при выполнении
@echo off
for /f "tokens=*" %%a in (05.txt) do call set msg=%%msg%% %%a
net send * %msg%
echo %msg%

Текст echo %msg% выводится какой-то закодированный.
Автор: res2001
Дата сообщения: 17.06.2010 10:05

Цитата:
Текст echo %msg% выводится какой-то закодированный.

те же проблемы с кодировкой что и в случае FTP.
Кодировка текстового файла (05.txt) и батника должны совпадать.


Добавлено:
barsikline

Цитата:
короче отсечь "Файл скопирован в" и оставить "каталог O:\Копия\"

Если строки в файле всегда начинаются одинаково и эту одинаковую часть надо отсечь, то можно тем же способом, что ты делал в самом начале:

Код: @Echo Off
for /f "tokens=*" %%a in (05.txt) do set vv=%%a & call set msg=%%msg%% %%vv:~26%%
echo %msg%
Автор: igor_andreev
Дата сообщения: 17.06.2010 13:59
barsikline

Цитата:
Через Total или Far все ок. Наверно ftp сервер кривой ).

Вполне может, у меня сейчас тоже не получилось стандартным ftp.exe с папкой "Инструкция" поработать Зато получилось с ftps.exe

Тебе нужна вот эта штука:
http://ftp.ipswitch.com/ipswitch/product_downloads/MOVEit_Portable_Install.zip

Это от разработчиков WS_FTP бесплатная замена стандартному консольному фтп-клиенту. Основной синтаксис такой-же, дополнительно приятные мелочи типа команд passive или sleep, возможность запуска c указанием юзера\пароля в комстроке:
ftps.exe -user:username -password:pass -s:script.txt
с SSL работает и т.п.

Можно просто поместить в PATH. Сами разработчики вообще советуют переименовать ftps.exe в ftp.exe и заменить стандартную виндовую ftp
Автор: lorents
Дата сообщения: 17.06.2010 15:38
Добрый день!
Подскажите пожалуйста, как можно получить список файлов с путями при Drag and Drop, и если можно чтобы работала с файлами которые лежат в папках.

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

Спасибо за внимание
Автор: king_stiven
Дата сообщения: 17.06.2010 16:05
lorents
Пролистни несколько страниц назад , ты уже задавал этот вопрос и я тебе ответил. Провалы в памяти? Лентяй ты здоровый.
Автор: lorents
Дата сообщения: 17.06.2010 16:18
king_stiven
я помню, но я так и не понял, как с этим работать?

Код: :hj
echo %1
shift
goto :hj
Автор: king_stiven
Дата сообщения: 17.06.2010 16:38
lorents
1 засунуть мой код в батник
2 Drag and Drop ом бросить на него выделенные что тебе надо и посмотреть глазами
3 Отчитаться о результате. Здесь. Полробно.
Автор: lorents
Дата сообщения: 17.06.2010 16:47
king_stiven
вот что выдает

Автор: wolf0425
Дата сообщения: 17.06.2010 16:50
lorents king_stiven а проверять что параметры закончились и давно "%~1" == "" - Пушкин должен?

Добавлено:

Код: @echo off
:hj
if "%~1" == "" echo completed & pause & exit
call :_proc %1
shift
goto :hj

:_proc
set "type=%~a1 "
if %type:~0,1% equ d (echo dir %1) else (echo file %1)
exit /b
Автор: king_stiven
Дата сообщения: 17.06.2010 16:56
lorents
1 Засунь в батник после
echo %1
команду pause
2 запусти
3 Периодически нажимай на ентер


Добавлено:
wolf0425
Спокойней, пациент нуждается в небольших дозах лекарств неторопливо и постепенно, полученные результаты должны не спеша зафиксироваться в мозгу, образовав устойчивые связи, а ты сразу его большими конструкциями пугаешь.
Автор: lorents
Дата сообщения: 17.06.2010 17:06
king_stiven
тоже самое, только теперь нет сплошного повтора, при попытка перенести файл, выдает тоже самое сообщение что и было

wolf0425
попробовал ваш вариант, при попытке перенести файл, батник закрывается, никаких сообщений нет, так и должно быть?
я как понимаю %~z1 и есть список файлов?
Автор: wolf0425
Дата сообщения: 17.06.2010 17:08

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

Автор: king_stiven
Дата сообщения: 17.06.2010 17:26
lorents
Вот мой результат:



C:\Documents and Settings\1>pause
Для продолжения нажмите любую клавишу . . .

C:\Documents and Settings\1>shift

C:\Documents and Settings\1>goto :hj

C:\Documents and Settings\1>echo D:\досуг\батники\пробные\1
D:\досуг\батники\пробные\1

C:\Documents and Settings\1>pause
Для продолжения нажмите любую клавишу . . .

C:\Documents and Settings\1>shift

C:\Documents and Settings\1>goto :hj

C:\Documents and Settings\1>echo D:\досуг\батники\пробные\6
D:\досуг\батники\пробные\6

C:\Documents and Settings\1>pause
Для продолжения нажмите любую клавишу . . .

C:\Documents and Settings\1>shift

C:\Documents and Settings\1>goto :hj

C:\Documents and Settings\1>echo D:\досуг\батники\пробные\7
D:\досуг\батники\пробные\7

C:\Documents and Settings\1>pause
Для продолжения нажмите любую клавишу . . .

1 руки выпрямляй, приведи свой текст батника
2 покажи как ты делаешь Drag and Drop
Автор: wolf0425
Дата сообщения: 17.06.2010 17:31
king_stiven с готовой паузой то любой дурак сможет
это тебе и мне не надо советов куда вписывать паузу если чего-то не то на экране
Автор: lorents
Дата сообщения: 17.06.2010 17:50
king_stiven

D:\Прочее\Image Optimizer>echo
Режим вывода команд на экран (ECHO) включен.

D:\Прочее\Image Optimizer>pause
Для продолжения нажмите любую клавишу . . .

D:\Прочее\Image Optimizer>shift

D:\Прочее\Image Optimizer>goto :hj

D:\Прочее\Image Optimizer>echo
Режим вывода команд на экран (ECHO) включен.

D:\Прочее\Image Optimizer>pause
Для продолжения нажмите любую клавишу . . .

D:\Прочее\Image Optimizer>shift

D:\Прочее\Image Optimizer>goto :hj

D:\Прочее\Image Optimizer>echo
Режим вывода команд на экран (ECHO) включен.

D:\Прочее\Image Optimizer>pause
Для продолжения нажмите любую клавишу . . .

Добавлено:

Цитата:
2 покажи как ты делаешь Drag and Drop

просто перетаскиваю файлы на запущенный батник
Автор: king_stiven
Дата сообщения: 17.06.2010 17:57
lorents
Ищи ошибки у себя, выполни это:

1 руки выпрямляй, приведи свой текст батника
2 покажи как ты делаешь Drag and Drop

Почитай в инете как правильно делать Drag and Drop

Добавлено:
lorents

Цитата:
просто перетаскиваю файлы на запущенный батник

неправильно, надо выделенные файлы перетащить на незапущенный батник.
Автор: lorents
Дата сообщения: 17.06.2010 18:31
king_stiven

Цитата:
неправильно, надо выделенные файлы перетащить на незапущенный батник.

понял спасибо!

wolf0425
спасибо!

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132

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


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