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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    wolf0425



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

    на самом деле это выглядит примерно так:
    Код:
    for /f %%a in ('dir /b /a-d c:\mydir\ ^| find /c /v "" ') do set "FilesInMydir=%%a"


    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 19:31 09-06-2010 | Исправлено: wolf0425, 19:33 09-06-2010
    WesternLight

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

    Цитата:
    date /t| 1>>Logs\consupdate.%startdate%.log "%MyFiles%\iconv.exe" -c -s -f 866 -t WINDOWS-1251

     
    NIKZZZZ, wolf0425, спасибо за помощь! Не знал, что можно так записывать... Я никак не разберусь с этими дескрипторами... не могу понять как их использовать, в голове не укладывается
     

    Цитата:
    WesternLight а ради чего такое извращение то?

     
    wolf0425, какое именно? Это "%MyFiles%\iconv.exe" -c -s -f 866 -t WINDOWS-1251?

    Всего записей: 61 | Зарегистр. 07-10-2007 | Отправлено: 19:36 09-06-2010
    wolf0425



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

    Цитата:
    wolf0425, какое именно? Это "%MyFiles%\iconv.exe" -c -s -f 866 -t WINDOWS-1251?
    именно. переключить консоль в 1251 кодировку и выкинуть iconv нафиг - какие-то проблемы?
    тем более что и в примере и date /t и time /t вообще букв не выводят ни в какой кодировке, только цифры - зачем их то перекодировать?
    да и текст батника в 1251 по нынешним временам комфортнее редактировать...
     
     
    Добавлено:

    Цитата:
    Я никак не разберусь с этими дескрипторами... не могу понять как их использовать, в голове не укладывается  
    в hh ntcmds.chm почитай redirecting command output, redirection overview

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 19:44 09-06-2010 | Исправлено: wolf0425, 20:03 09-06-2010
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Я не это имел в виду - команда DIR без указания /b выводит в последних двух строках суммарное количество файлов и папок. Не будет ли быстрее работать если найти эти строки при помощи find и отпарсить результат? На больших объемах это может быть критично...

    ----------
    Всем непричастным рекомендую прогулки на свежем воздухе

    Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 20:06 09-06-2010
    WesternLight

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

    Цитата:
    переключить консоль в 1251 кодировку и выкинуть iconv нафиг - какие-то проблемы?  

     
    wolf0425, т.е. я могу писать батник в 1251, все сообщения на русском в окно консоли будут выводится корректно и все сообщения в лог тоже, я правильно понимаю? И все это будет работать и на Win 2000?

    Всего записей: 61 | Зарегистр. 07-10-2007 | Отправлено: 20:11 09-06-2010
    wolf0425



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

    Цитата:
    Не будет ли быстрее работать если найти эти строки при помощи find и отпарсить результат?  
    ну вообще-то будет, хоть и незначительно. парсить то тем же поиском - откуда разнице браться?
     
    у меня 100к файлов find /с считает ~2.4 секунды, а парсинг с выдиранием готового количества
    Код:
    for /f %%a in ('dir /a-d test\ ^| findstr /b /c:"        " ') do if not defined FilesInMydir1 set "FilesInMydir1=%%a"  
    ~2c

    Код:
    for /f %%a in ('dir /a-d test\ ^| findstr /r /b /c:"  [^:]*$" ') do if not defined FilesInMydir2 set "FilesInMydir2=%%a"
    ~2.2c

    Код:
    for /f "skip=3" %%a in ('dir /a-d test\ ^| find /v ":" ') do if not defined FilesInMydir3 set "FilesInMydir3=%%a"  
    ~3.6c
     
    в сравнении с 80+ секундами пересчета файлов инкрементом - разница способа парсинга почти незаметна

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 20:26 09-06-2010 | Исправлено: wolf0425, 20:43 09-06-2010
    Mark_Titov



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Не большой косячок вылез - не то что бы критично конечно, но хотелось бы уж до ума довести это...
    Припервом запуске батника он по условию указанному здесь -
     
    2>nul MD "%systemdrive%\AN-80\%mes%\" && goto :htm
     

    Код:
    :ping-ok
    set "mes=%date:~-7%"
    2>nul MD "%systemdrive%\AN-80\%mes%\" && goto :htm
    2>nul MD "%systemdrive%\AN-80\%mes%\%date%"
    set "Log=%systemdrive%\AN-80\%mes%\%date%\log.txt"
    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.СРЕДНЕ-АРИФМЕТИЧЕСКИЙ ПРОЦЕНТ ПОТЕРИ СВЯЗИ ЗА %mes%
    1>>%systemdrive%\AN-80\%mes%\Monthly-report.txt echo --------------------------------------------------------------------------
    1>>%systemdrive%\AN-80\%mes%\Monthly-report.txt echo.
    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%%%
    )
    sleep 300
    goto :ping

     
    ...идет на создание AN-80 Log.htm ПЫТАЯСЬ скопировать в него с Monthly-report.txt от предыдущего месяца, 1-вого числа каждого месяца это правильно и отлично работает - НО ОН ЖЕ ПЕРВЫЙ РАЗ ЗАПУСТИЛСЯ! Потому у него нет этого Monthly-report.txt! И далее по коду - созданный AN-80 Log БЕЗ ИНФОРМАЦИИ В НЕМ (пустое письмо) отсылается на мыло. Условие-то правильное, но правильное оно для того что бы 1-го числа каждого месяца отсылать СФОРМИРОВАННЫЙ отчет же...
     
    Как сделать так что бы он при первом запуске создавая папку не отсылыл пустое письмо  Помоги...
    Может добавить условие проверки самой ПЕРВОЙ папки - AN-80? Типа если ее нет (это будет означать что батник вообще в первый раз запустили), то goto :ping-ok?

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



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

    Цитата:
    wolf0425, т.е. я могу писать батник в 1251, все сообщения на русском в окно консоли будут выводится корректно и все сообщения в лог тоже, я правильно понимаю? И все это будет работать и на Win 2000?
    фонт консоли (в заголовке окна или в ярлыке) на уникодный переключаешь - и корректные русские сообщения корректно видишь и в 866 и в 1251. уникодный - это например люсида, хотя некоторые запали на consolas
     
    А все программы выдают вывод (в консоль или в лог) в той кодировке, которая установлена последней командой chcp NN (при отсутствии такой команды - в той, что в системе по умолчанию, т.е OEM/дос обычно)
     

    Код:
    echo off
    chcp 1251 >nul
    1>>Logs\consupdate.%startdate%.log (
    date /t
    time /t
    echo русский текст в 1251 кодировке
    )
    type "c:\русский_файл.txt"
     
    т.е. например такой батник, сохраненный в 1251 - вполне правильно работает, в том числе замечательно понимает файлы с длинным тире или с «quotes» в имени.
     
     
    Mark_Titov

    Цитата:
    Как сделать так что бы он при первом запуске создавая папку не отсылыл пустое письмо
    а проверить что mes_log или как там называлась переменная с именем лога в том куске кода что ты поскипал во что-то установлена при поиске последнего Monthly-report - религия не позволяет?
     
     
     
     

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 20:55 09-06-2010 | Исправлено: wolf0425, 21:03 09-06-2010
    WesternLight

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

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

     
    прикольно, работает... но вот переключать на 30 машинах у меня нет возможности, можно ли как-то установить шрифт по умолчанию из моего же батника? может импортом в реестр чего-то?

    Всего записей: 61 | Зарегистр. 07-10-2007 | Отправлено: 20:58 09-06-2010
    wolf0425



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

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

    Код:
    [HKEY_CURRENT_USER\Console]
    "ScreenBufferSize"=dword:00190050
    "WindowSize"=dword:00190050
    "FontSize"=dword:00120000
    "FontFamily"=dword:00000036
    "FontWeight"=dword:00000190
    "FaceName"="Lucida Console"
    "CursorSize"=dword:00000019

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 21:10 09-06-2010 | Исправлено: wolf0425, 22:22 09-06-2010
    WesternLight

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

    Цитата:
    а вообще - наверно это HKEY_CURRENT_USER\Console  
    только там к фонту много настроек, проверять что реально надо переносить - мне пока лень.

     
    да, я уже нашел, вот содержание reg-файла, кому-нибудь пригодится:
     
    Windows Registry Editor Version 5.00
     
    [HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]
    "FaceName"="Lucida Console"
    "FontSize"=dword:00100000
    "FontFamily"=dword:00000036
    "FontWeight"=dword:00000190

    Всего записей: 61 | Зарегистр. 07-10-2007 | Отправлено: 22:20 09-06-2010
    wolf0425



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

    Цитата:
    да, я уже нашел
    упс, не успел вовремя поправить
    ну и я немного с запасом там прихватил...  

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 22:23 09-06-2010 | Исправлено: wolf0425, 22:24 09-06-2010
    WesternLight

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425, спасибо! завтра буду переписывать код... интересно, а можно как-то с помощью bat проверять наличие в реестре определенной записи, например, вышеприведенных параметров? нужно для того, чтобы батник проверял какой шрифт выбран по умолчанию и если не lucida, тогда применял reg-файл...

    Всего записей: 61 | Зарегистр. 07-10-2007 | Отправлено: 22:26 09-06-2010 | Исправлено: WesternLight, 22:27 09-06-2010
    wolf0425



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

    Цитата:
    а можно как-то с помощью bat проверять наличие в реестре определенной записи, например, вышеприведенных параметров?
    reg query /?  
    только не уверен что на win2k reg.exe уже был, как бы не начиная с ХР утилита.
     
    но в худшем случае - можно же старыь regedit.exe экспортировать HKEY_CURRENT_USER\Console в формате regedit4 и пропарсить как текст...

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 22:44 09-06-2010 | Исправлено: wolf0425, 22:46 09-06-2010
    barsikline



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

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

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

     
    Напрямую туда заходит, это я проверял. Тут проблема именно в 2-х пробелах в имени каталога "Инструкции и документация". Проверял если бы, к примеру, стояло просто "Инструкция документация", то все ок. Что можно сделать?

    Всего записей: 33 | Зарегистр. 24-10-2008 | Отправлено: 01:46 10-06-2010
    AkeHayc

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вот строчка из файла:
    Сенчевская; Вера Алексеевна;    Главный специалист по опер.учету;    258-44-44, 266-44-44, вн. 128;    8 701 739 02 91;    finance@globalair-kz.com;    11.06.1946;    258-42-59;    293 52 17;
     

    Всего записей: 519 | Зарегистр. 24-02-2009 | Отправлено: 07:12 10-06-2010 | Исправлено: AkeHayc, 07:15 10-06-2010
    Mark_Titov



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

    Цитата:
    Mark_Titov  
    Цитата:Как сделать так что бы он при первом запуске создавая папку не отсылыл пустое письмо  
    а проверить что mes_log или как там называлась переменная с именем лога в том куске кода что ты поскипал во что-то установлена при поиске последнего Monthly-report - религия не позволяет?
     

    wolf0425, не получается, помоги уже все варианты перепробовал - все равно при первом запуске на создание пустого отчета идет...

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как должен выглядеть батник, проверяющий состояние определённых (известных) служб и, в случае необходимости, стартующий их?
    Т.е. по-русски: ЕСЛИ статус %servicename% STOPPED - запустить, если же STARTED - ничего не делать, перейти к следующему %servicename% и выполнить такую же проверку.
    Всего сервисов 3.
     
     
     
     
    Спасибо.

    Всего записей: 1972 | Зарегистр. 04-08-2006 | Отправлено: 10:00 10-06-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    sarti
    можно и не проверять текущий статус, делай
    net start имя службы - если не запущена - запустится, иначе ничего не произойдет.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 10:18 10-06-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sarti
    Цитата:
    Т.е. по-русски: ЕСЛИ статус %servicename% STOPPED - запустить, если же STARTED - ничего не делать, перейти к следующему %servicename% и выполнить такую же проверку.  

    sc start чегонадо
    проверять запущены ли, если всё равно стартовать - смысла особого нет, но можно:  
    sc query NoIPDUCService |findstr /i /r /b /c:" *state.*stopped" >nul && sc start NoIPDUCService
     
    Mark_Titov
    Цитата:
    уже все варианты перепробовал
    пока не вижу что ты воспользовался предыдущим советом. или хотя бы попытался.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 12:27 10-06-2010 | Исправлено: wolf0425, 12:40 10-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