Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 8

Модерирует : KLASS, IFkO

vu1tur (04-09-2010 17:46): http://forum.ru-board.com/topic.cgi?forum=62&topic=21297  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

   

vu1tur



Moderator-Saaber
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Задачи на bat-файлах 8
(часть 1, часть 2, часть 3, часть 4, часть 5, часть 6, часть 7)
Вопросы, задачи и их решения по работе с командными файлами, а также сопутствующие ссылки.

 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!
 
Также для удаления концевых пробелов пользуйтесь скриптом от Nagual, или VBS-Скрипт-Модулем от ViSiToR.
 
Для перекодирования кирилицы 866<<>>1251 пользуйтесь онлайн сервисом Перекодировщик кириллицы

 
Дополняем шапку: добавляем готовые решения, полезные ссылки.
 
Примечание: Большие куски кода заключайте в тэг [more]  
 
Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Программы » Командная строка, батники\сценарии
 
Полезные ссылки
 
Полезные утилиты
 
Готовые решения и частые вопросы:
  • Встроенный справочник по командам
  • Создание помощи по всем командам консоли 2000 и XP
  • Делаем паузу в командном файле стандартными средствами Windows
  • Альтернативные решения »
  • Работа с текстом, датой, и файлами »
  • Администрирование, автоматизация и сеть »
  • Работа с переменными и параметрами ком. строки »
     
    Описания работы команд и символов участниками темы:
    · setlocal enabledelayedexpansion и переменные окружения
    · символы & и && в командной строке
    · Переменная %0

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 12:40 25-01-2010 | Исправлено: bomzzz, 13:37 20-08-2010
    Mark_Titov



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    или > в нижней строке потеряно или верхняя ничего не делает

    ...так по другому он вообще не правильно считает
     
    Добавлено:

    Цитата:
    Mark_Titov  
    Вообще неплохо было бы привести кусок файла статистики - чтоб не возиться с его созданием...

    ...Да там просто запустить этот батник - он создаст папку с датой и логами, переименовываешь эту папку на вчерашнюю дату и запускаешь батник еще раз - он создаст еще одну папку уже с сегодняшним числом и в Monthly-report.txt будет статистика которую батник и подсчитывает - тогда и будут косяки видны...

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 15:09 08-06-2010 | Исправлено: Mark_Titov, 15:20 08-06-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 15:25 08-06-2010
    ComradG



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    Ooooops!

    Код:
    set /a "month=1%month%-100"  
    for /f "tokens=%month%" %%i in ("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec") do set "month=%%i"

    В Win 2k8 не работал корректно только в RC1, в RC2 работает нормально при условии, что расширенные (advanced) функции парсера отключены (а они у меня всегда включены по умолчанию (задано было при установке - отсюда и неразбериха с несоответсвием стандартов)). В RC1 была бага связанная с некоректной обработкой парсером значений типа char.

    Всего записей: 2041 | Зарегистр. 05-07-2008 | Отправлено: 15:43 08-06-2010
    Mark_Titov



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425

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

    ...при обнулении он пересчитывает все заново и подсчитывает средний результат.
    А на счет в другом месте - он же и создает эти файлы с папками и пути в нем де прописаны...
     
    Просто код скопируй - сделай батник и запусти, там все понятно будет...

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 15:48 08-06-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mark_Titov
    Цитата:
    ...при обнулении он пересчитывает все заново и подсчитывает средний результат.  
    при этом - подсчитывает текущую статистику за день и за месяц на каждом проходе пинга, я в курсе.
    ты чем спорить - лучше бы сам задумался/проверил что изменится если первую из трех процитированных строк тупо удалить.
     
    а хотел ты написать видимо вот это:

    Код:
    @echo off
    chcp 1251
     
    :ping
    rem cls
    set /a day_sum=0
    set /a day_count=0
    set /a mes_sum=0
    set /a mes_count=0
    set /A count=count+1
    Title Pinging number %count%
    set "site=127.255.255.255 -w 10"
    set "mes=%date:~-7%"
    1>nul 2>&1 MD "%systemdrive%\AN-80\%mes%\%date%"
    set "Log=%systemdrive%\AN-80\%mes%\%date%\log.txt"
     
    for /f "tokens=2 delims=()" %%a in ('ping -n 4 %site%') do 1>>%log% echo.%date% %time:~,8% %%a
    for /f "tokens=3 delims=%% " %%a in (%systemdrive%\AN-80\%mes%\%date%\log.txt) do set /a day_sum += %%a*100 & set /a day_count += 1
     
    set /a day_average=(%day_sum%)/(%day_count%) +10000
    set /a day_average_int = %day_average:~0,-2% -100
     
    1>%systemdrive%\AN-80\%mes%\Monthly-report.txt        echo.%date% %time:~0,-3%
    1>%systemdrive%\AN-80\%mes%\%date%\Daily-report.txt     echo Средне-арифметический процент потери связи за %date% составил = %day_average_int%.%day_average:~-2%%%
     
    for /f "delims=" %%a in ('dir /b /s %systemdrive%\AN-80\%mes%\Daily-report.txt') do type %%~fa 1>> %systemdrive%\AN-80\%mes%\Monthly-report.txt
    for /f "tokens=9 delims=%% " %%a in (%systemdrive%\AN-80\%mes%\Monthly-report.txt) do set "mes_tmp=%%a" & set /a mes_count += 1 & call set /a mes_sum += %%mes_tmp:.=%%
     
    set /a mes_average=(%mes_sum%)/(%mes_count%)+10000
    set /a mes_average_int=%mes_average:~0,-2%-100
    set mes_
    1>> %systemdrive%\AN-80\%mes%\Monthly-report.txt (
        echo.
        echo -------------------------------------------------------------------------
        echo Средне-арифметический процент потери связи за %mes% составляет - %mes_average_int%.%mes_average:~-2%%%
    )
     
    rem goto :ping  
     
    зацикливание пока закомментарено.
     
    но на самом деле ещё переписывать надо, так как сама логика подсчета хромает:
    если вчера пинганули 10 раз и было 100% потерь, а сегодня пинганули 100 раз и было 0% потерь, то средние потери за месяц вовсе не должны быть 50%, как получается по результатам этой программы.
     
     
     
     
     

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 16:07 08-06-2010 | Исправлено: wolf0425, 16:44 08-06-2010
    Mark_Titov



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425, спасибо тебе большое.

    Цитата:
    десятые доли процента дневной статистики - тупо игнорируются

    ...Действительно -
     

    Цитата:
    08.06.2010 17:42:16  
    Средне-арифметический процент потери связи за 08.06.2010 составил = 18.47%  
     
    -------------------------------------------------------------------------  
    Средне-арифметический процент потери связи за 06.2010 составляет - 18.00%  

     

    Цитата:
    или надо чего-то с ними придумывать?

    ...Пожалуйста, если не трудно, очень прошу.
    А, можно сделать так - если есть несколько папок с log.txt и Daily-report на разные даты, то что бы он во всех имеющихся подпапках МЕСЯЦА пересчитывал заново и переписывал Monthly-report?
     
    Огромное спасибо за твой труд wolf0425...

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 16:53 08-06-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    ..Пожалуйста, если не трудно, очень прошу.  
    придумал уже, код перезалит
     
     
    Добавлено:

    Цитата:
    А, можно сделать так - если есть несколько папок с log.txt и Daily-report на разные даты, то что бы он во всех имеющихся подпапках МЕСЯЦА пересчитывал заново и переписывал Monthly-report?  
    да всё можно, только не всё нужно. это же небыстрая и жужжащая винтом операция получится.
     
    и у тебя чего-то странное в хотелке:
    все Daily-report  и в этой версии заново сканируются при каждом создании Monthly-report.
    который - единственный в папке месяца и на каждом проходе пересоздается.
    так же на каждом проходе пересчитывается текущий Daily-report  
     
    напиши заново чего хочешь - чтоб Monthly-report пересчитывался на основании всех log.txt  текущего месяца, а не на основании всех Daily-report что-ли?
    или все Daily-report за предыдущие дни месяца - тоже предлагается пересчитывать?

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 16:55 08-06-2010 | Исправлено: wolf0425, 17:07 08-06-2010
    Mark_Titov



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    придумал уже, код перезалит

    ...Красиво wolf0425!!! Ну ты крут должен сказать...
     
    Спасибо тебе огромное, дружище, как всегда выручил!...
    Снимаю шляпу!...
     
    Добавлено:

    Цитата:
    единственный в папке месяца и на каждом проходе пересоздается.

    ...вот щас он не пересоздается. Пробовал удалить, код не пересоздал и не пересчитал log.txt.
     
    Добавлено:

    Цитата:
    напиши заново чего хочешь - чтоб Monthly-report пересчитывался на основании всех log.txt  текущего месяца, а не на основании всех Daily-report что-ли?

    C последним вариантом кода попробуй создай еще одну папку вчерашним числом и удали из нее Daily-report и еще раз запусти код и посмотри что он посчитает...

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 17:10 08-06-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    ...вот щас он не пересоздается. Пробовал удалить, код не пересоздал и не пересчитал log.txt.  
    ты чего-то путаешь, Monthly-report.txt - пересоздается  

    Цитата:
    попробуй создай еще одну папку вчерашним числом и удали из нее Daily-report и еще раз запусти код и посмотри что он посчитает...
    да я и так скажу что посчитает на один Daily-report меньше - в цикле пересчитывается только сегодняшний Daily-report, существующие старые просто окучиваются для генерации Monthly-report.txt.
     
    можно не набор Daily-report.txt окучивать, а генерить статистику просто на основе всех суточных log.txt, вообще не создавая Daily-report
    но тут возникает вопрос - а какая точно статистика нужна. выше вопрос про 50% потерь за два дня видишь?
     
    держи переделанную версию

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 17:27 08-06-2010 | Исправлено: wolf0425, 18:00 08-06-2010
    Mark_Titov



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425

    Цитата:
    можно не набор Daily-report.txt окучивать, а генерить статистику просто на основе всех суточных log.txt, вообще не создавая Daily-report

    Вообщем-то и так можно...

    Цитата:
    выше вопрос про 50% потерь за два дня видишь?

    ...нет, где потери?

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 18:16 08-06-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    ...нет, где потери?

    Код:
    если вчера пинганули 10 раз и было 100% потерь, а сегодня пинганули 100 раз и было 0% потерь, то средние потери за месяц вовсе не должны быть 50%, как получается по результатам этой программы.

     

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 18:23 08-06-2010
    Mark_Titov



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    держи переделанную версию

    ...тоже не плохо, дневные считает, а итоговые за весь период?
    К стати это что?
    Средне-арифметический процент потери связи за %~nx1 составил = %day_average_int%.%day_average:~-2%%%  
     
    Добавлено:

    Цитата:
    если вчера пинганули 10 раз и было 100% потерь, а сегодня пинганули 100 раз и было 0% потерь, то средние потери за месяц вовсе не должны быть 50%, как получается по результатам этой программы.

    ...ну погонять нужно - там посмотрим что покажет.

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 18:39 08-06-2010
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    если вчера пинганули 10 раз и было 100% потерь, а сегодня пинганули 100 раз и было 0% потерь, то средние потери за месяц вовсе не должны быть 50%

    Интересно, а какой по твоему должен быть процент?

    Всего записей: 2232 | Зарегистр. 17-07-2006 | Отправлено: 18:45 08-06-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    ...тоже не плохо, дневные считает, а итоговые за весь период?  
    ну да, сразуу пишет построчно Monthly-report.txt со всеми дневными и в конце итоговой месячной статистикой.
     

    Цитата:
    К стати это что?
    Средне-арифметический процент потери связи за %~nx1 составил = %day_average_int%.%day_average:~-2%%%  
    а что, в логе не видно? дата, точнее имя того дневного каталога, для которого эта строка.
     
    king_stiven

    Цитата:
    Интересно, а какой по твоему должен быть процент?
    вообще-то когда за "месяц" пинганули 110 раз и потеряли 10 пакетов - это обычно считается 9% потерь, а не 50% )
     
     
     

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 18:54 08-06-2010 | Исправлено: wolf0425, 18:58 08-06-2010
    Mark_Titov



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Слушай, я уже несколько дней голову ломаю как можно сделать.
    Этот отчет потом у меня копируется в htm файл и должен отправляться на мыло в ПОСЛЕДНИЙ ДЕНЬ КАЖДОГО МЕСЯЦА.
    Почему последний? Потому что количество дней в месяцах не одинаково. Так вот, весь месяц этот батник проверяет связь, генерирует отчеты и
    в ПОСЛЕДНИЙ ДЕНЬ КАЖДОГО МЕСЯЦА отсылает - как сделать ума не приложу? Теперь все готово, кроме этой заключительной части кода...
    Нужно теми же средствами все реализовать и все 3 части в один код соединить...
     
    Добавлено:
    P.s
    Другими словами - нужно что бы код каким-то образом проверял дату (а может быть и время еще) для определения когда посылать данный отчет...

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 18:57 08-06-2010 | Исправлено: Mark_Titov, 18:58 08-06-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Слушай, я уже несколько дней голову ломаю как можно сделать.
    Этот отчет потом у меня копируется в htm файл и должен отправляться на мыло в ПОСЛЕДНИЙ ДЕНЬ КАЖДОГО МЕСЯЦА.
    Почему последний? Потому что количество дней в месяцах не одинаково. Так вот, весь месяц этот батник проверяет связь, генерирует отчеты и
    в ПОСЛЕДНИЙ ДЕНЬ КАЖДОГО МЕСЯЦА отсылает - как сделать ума не приложу? Теперь все готово, кроме этой заключительной части кода...
    Нужно теми же средствами все реализовать и все 3 части в один код соединить...:confused:
    так вот проблемы у тебя в голове - от того что ты неправильно задачу ставишь.
    Отсылать то отчет надо не в последний день старого в месяца, а при первом прогоне цикла в начале нового месяца, когда только-только появились полные результаты за прошедший месяц.
     
    т.е. прикручивается примерно так:
    (отсылка в момент успешного создания нового месячного каталога)

    Код:
    :ping
    set /a mes_sum=0
    set /a mes_count=0
    set /A count=count+1
    Title Pinging number %count%
    set "site=127.255.255.255 -w 10"
    ::set "site=127.0.0.1 -w 10"
    set "mes=%date:~-7%"
    2>nul MD "%systemdrive%\AN-80\%mes%\" && call :otchet
    2>nul MD "%systemdrive%\AN-80\%mes%\%date%"
    set "Log=%systemdrive%\AN-80\%mes%\%date%\log.txt"
     
    в сабе :otchet надо найти последний Monthly-report.txt и отослать.
     

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 19:21 08-06-2010 | Исправлено: wolf0425, 19:21 08-06-2010
    BagaBaga

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425, спасибо.
     
    При массовой правке табулированных файлов столкнулся с такой задачей (усложненной по сравнению с уже решенной http://forum.ru-board.com/topic.cgi?forum=62&topic=19668&start=1680#7):
    В заданном файле в фиксированную строку (пусть, №4 по порядку) заменить последовательность символов, начиная с 20-ой позиции, на другую. При этом эта "другая последовательность" лежит в другом файле - состоящем только из одной строки. Если срока-замещение длиннее, чем число символов от 20-ой позиции и до конца 4ой строки, то замена не происходит.
     
    Собственно, возможно ли это (с помощью sed)?
     
    PS
    Вариант с 6ю символами сильно облегчил мне задачу, но, как выснилось, все немного сложнее

    Всего записей: 463 | Зарегистр. 14-11-2005 | Отправлено: 19:56 08-06-2010 | Исправлено: BagaBaga, 19:58 08-06-2010
    Mark_Titov



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    т.е. прикручивается примерно так:

    ...а в какой последовательности это все скрутить с этим кодом?
     
    код

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 20:05 08-06-2010 | Исправлено: Mark_Titov, 20:33 08-06-2010
    Sustaw

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Обращаюсь снова, задача такова: на сервере после выполнения определенных задач создается лог файл. Его нужно отправить на определенный комп в такую то директорию, но этот определенный комп выключен. Как так сделать чтоб сервер опрашивал заданный комп с промежутком в час или полтора, и в случае положительного ответа отправлял заданный файл куда надо? Опять же примеру скрипта был бы рад.

    Всего записей: 6 | Зарегистр. 25-05-2010 | Отправлено: 20:36 08-06-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

    Цитата:
    но теперь нужно создать условие - если создалась новая папка месяца - то GOTO :MAIL.  
    ну есть же в куске:  
     

    Код:
    2>nul MD "%systemdrive%\AN-80\%mes%\" && call :otchet
    там не goto a call чтоб создание отчета было проще выделять в отдельный кусок. но можно и goto вписать, если не влом лишние метки плодить (батник же продолжить надо)
     
    дословно строка делает:
    создаем каталог, сообщение об ошибке прячем. Если команда выполнена успешно, т.е. создать каталог получилось (т.е. такого каталога раньше не было) - то отрабатываем то что справа от &&  
    всех делов.

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 20:38 08-06-2010 | Исправлено: wolf0425, 20:41 08-06-2010
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 8
    vu1tur (04-09-2010 17:46): http://forum.ru-board.com/topic.cgi?forum=62&topic=21297


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru