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

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

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

evle (19-03-2008 19:44): Лимит страниц.
Задачи на bat-файлах 5
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 15:21 11-09-2007 | Исправлено: Elroir, 01:52 26-02-2008
    Elroir



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

    Цитата:
    У меня есть какие-нибудь шансы?))  

    Есть. Посмотри майкрософтовсксую программку AppLocale

    ----------
    "В интернете есть все, но не всегда"

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 14:09 06-12-2007
    kotLeon

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В общем есть такая проблема нужно выключать компы по сети с помощью батника, попробовал вот такие структуры команды shutdown:
    shutdown /m \\namecomp /s /f /t 0
    shutdown [-s][-f][-m \\namecomp][-t 01]
    и к моему разочарованию возникла такая проблема: команда в цикле повторяется но комп не тушит. Хотя первая структура работала на ура в другой сети. Обе сети доменные.
    Если кто то знает что это за проблема помогите мне разобраться. Или может есть какаято другая команда, сама суть проблемы стоит не как в выключении компа, а в завершении всех запущенных программ на компе.
    Спасибо.

    Всего записей: 6 | Зарегистр. 03-12-2007 | Отправлено: 14:19 06-12-2007
    Dark Tiger



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

    Цитата:
    Доброго всем коннекта уважаемые читатели этого форума!  
    Встала передо мной такая вот проблема, в одном из офисов имеется местный провайдер интернета, подключение к которому осуществляется через VPN соединение. Непонятно от чего, но проблема точно не в наших компьютерах, это самое VPN соединение само по себе иногда отваливается, при чём абсолютно непонятно при каких обстоятельствах, может и неделю комп круглосуточно работать и всё гуд, а может и через 2-3 часа переодически отваливаться. Ну да ладно, вообщем у меня такая просьба к мастерам по написанию скриптов:  
    Нужно сделать так что бы осуществлялась проверка VPN соединения (ну или хотя бы пинг например до ya.ru), например переодически раз в 30 минут, и если выявлялось бы что оно выключено, то запускалось бы автоматически, без каких либо вмешательств пользователя.  
    Заранее спасибо.

     
    А для моей проблемы батники не подходят что ли?

    Всего записей: 101 | Зарегистр. 12-12-2005 | Отправлено: 15:45 06-12-2007
    Andre3000

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir, я пробовал. Все равно вылетает.

    Всего записей: 11 | Зарегистр. 06-04-2007 | Отправлено: 15:50 06-12-2007
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Dark Tiger
     
    В шапку ходил?

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 15:53 06-12-2007
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SapSat, echo creation 2>tmplist1.txt  
    Это вывод слова на экран и перенаправление потока ошибок (2) в файл.
    Так как ошибки нет - ничего не выведется и файл будет нулевого размера.
    Это делается на случай, если батник уже запускалии остались старые файлы.
     
    RO файлы такая конструкция не обнуляет, но если они почему-то RO - то кто-то ССЗБ.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 16:17 06-12-2007 | Исправлено: wolf0425, 16:18 06-12-2007
    SapSat

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
     
    Спасибо.
     
    Теперь появилась новая задача.
    Есть лог-файл (сотни тысяч строк)
    Строка типа:
     
    Дата,время,число1,число2,число3,число4,число5
     
    Надо определить MIN, MAX, MID - например по всем числам3
    (минимальное, максимальное и среднее значение).
    Плюс - желательно - для MIN и MAX выдать номер строки где это значение встретилось...
     
    ?

    Всего записей: 32 | Зарегистр. 27-11-2007 | Отправлено: 16:25 06-12-2007
    Dark Tiger



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    king_stiven
    Да, конечно.
    Я нашёл там 2 темы:
    1 - Запуск сетевого соединения и 2 -  Пример выполнения команд по результату команды ping
    Но я если честно в синтаксисе командной строки мало что понимаю, подумал может быть кто нибудь уже был с подобной проблемой и имеет готовый скрипт, если же нет попробую сам как нибудь совместить.

    Всего записей: 101 | Зарегистр. 12-12-2005 | Отправлено: 16:31 06-12-2007
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Dark Tiger
    Конструктивнее будет привести свой вариант, и показать, где не срабатывает или где не понятно, тогда сразу поправят. Опять же есть справка по командам, что не ясно, обьясним. Сам не в теме.

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 16:37 06-12-2007 | Исправлено: king_stiven, 16:43 06-12-2007
    Dark Tiger



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    king_stiven
    Ок, спасибо.
    Вечерком тогда дома попробую у себя аналогично что либо сделать.

    Всего записей: 101 | Зарегистр. 12-12-2005 | Отправлено: 16:40 06-12-2007
    01MDM



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

    Код:
     
    @echo off
    setlocal enabledelayedexpansion
    for /l %%i in (1,1,1000) do set zz!random!!random!=%%i
    for /f "tokens=2 delims==" %%i in ('set zz ^| sort') do echo %%i
     

    Два random'а потому что среди тысячи комбинаций встречаются повторы. Даже если написать !random!%%i=%%i

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 17:36 06-12-2007
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM я по секрету скажу, что и для трех рандомов подряд _могут_ встречаться повторы. В этом смысл рандомного рандома
    Хочешь без повторов - считай md5 от соль+счетчик цикла
    но реально повторы ведут imho лишь к несущественному такой маленькой выборке ухудшению качества rnd
     
    с set zz.. мне нравится меньше чем с файлом. почему-то. кажется, что при длинных выборках - время будет нарастать сильнее, про прожорливость памяти уж не говорю.
     
    SapSat, надо найти мин/макс и среднее по колонке число3 (например)?  
    и загрузить файл в эксель - почему-то ломает?
     
    посчитать мин/макс батником - не вижу проблем тебе самому разобрать через for /f "delims=," , а вот со средним - может и обломиться на разрядности maxint.
    В любом случае для 100k строк это будет довольно медленно.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 18:13 06-12-2007 | Исправлено: wolf0425, 18:14 06-12-2007
    Dark Tiger



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Помогите разобраться вот пожалуйста, реально завтра надо это уже реализовать.
     
    Вот пример скрипта на выполнение команды по результату ping:
     

    Код:
    @Echo Off  
    Set cWork=0  
    For /l %%a In (2,1,254) Do Call :CompWork 192.168.0.%%a  
    If %cWork%==0 (ShutDown /?)  
    GoTo :EOF  
     
    :CompWork  
    Echo Ping %1  
    Ping -n 1 %1 >Nul  
    If ErrorLevel 1 (Goto :EOF)  
    If ErrorLevel 0 (Set cWork=1)  
    GoTo :EOF

     
    В моём же случае требуется если пинг не проходит например до ya.ru этот скрипт выполнял команду rasdial  с нужными мне параметрами (какие я естественно знаю).
    Если пинг проходит то всё оставлять как есть и ничего не трогать.
     
    Помогите пожалуйста.

    Всего записей: 101 | Зарегистр. 12-12-2005 | Отправлено: 20:16 06-12-2007
    01MDM



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

    Цитата:
    требуется если пинг не проходит например до ya.ru этот скрипт выполнял команду rasdial

     

    Код:
     
    ping ya.ru >nul && echo Network is available || rasdial
     
    или просто  
     
    ping ya.ru >nul || rasdial
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 21:27 06-12-2007 | Исправлено: 01MDM, 21:32 06-12-2007
    Ilyansk

    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Dark Tiger
     
    то, что Вы скачали
     

    Цитата:
    @Echo Off  
    Set cWork=0  
    For /l %%a In (2,1,254) Do Call :CompWork 192.168.0.%%a  
    If %cWork%==0 (ShutDown /?)  
    GoTo :EOF  
       
    :CompWork  
    Echo Ping %1  
    Ping -n 1 %1 >Nul  
    If ErrorLevel 1 (Goto :EOF)  
    If ErrorLevel 0 (Set cWork=1)  
    GoTo :EOF

     
    приведенный код пингует по очереди компьютеры локальный сети начиная с адреса 192.168.0.2 по 192.168.0.254, если хоть от одного есть пинг, то команда ShutDown /? не выполняется (наверное, "гашение" сервера при всех отключенных от сетки компах)
    Если должна выполниться команда Shutdown, то это произойдет не скоро. Пинг 252 отключенных компов...
     
    используйте код, представленный 01МDM

    Всего записей: 70 | Зарегистр. 27-07-2006 | Отправлено: 09:50 07-12-2007 | Исправлено: Ilyansk, 09:56 07-12-2007
    popalka



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    как передать результат выполнения команды в переменную?
     
    Стоит такая задачка:  
    проверять, отвалилась ли служба или нет и в случае, если отвалилась, стартовать ее.
     
    Хочу сделать разбор результата команды
     
    net start | find "ServiceName"  
     
    Можно, конечно в файл-семафор записывать, но как-то не изящно..
    Может кто знает?

    Всего записей: 70 | Зарегистр. 25-06-2004 | Отправлено: 10:43 07-12-2007 | Исправлено: popalka, 10:44 07-12-2007
    SapSat

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

    Цитата:
     
    посчитать мин/макс батником - не вижу проблем тебе самому разобрать через for /f "delims=," , а вот со средним - может и обломиться на разрядности maxint.  
     

     
    Да в том то и дело, что что-то не идет. Думал - посмотрю - что люди добрые предложат...
    В общем - мой код такой:

    Код:
     
    @echo off  
    setlocal enabledelayedexpansion  
    set /a i=0
    set /a min=0
    set /a max=0
    set /a mid=0
    echo processing 2>results1.txt    
    for /f "tokens=1,2,3,4,5*" %%a in (test.log) do (
    set /a i+=1
    if %min%==0 set /a min=%%e
    if %max%==0 set /a max=%%e
    echo %i% %min% %max% >>results1.txt
    if %%e LSS %min% set /a min=%%e & set /a imin=%i%
    if %%e GTR %max% set /a max=%%e & set /a imax=%i%
    set /a mid=%mid% + %%e
    echo %i% MIN=%min% in %imin%. MAX=%max% in %imax%. MID=%mid% >>results1.txt
    )
    set /a mid=%mid% / %i%
    echo MIN = %min% in the line number %imin% >>results1.txt
    echo MAX = %max% in the line number %imax% >>results1.txt
    echo MID = %mid% in total lines %i% >>results1.txt
     

     
    Маленький пример файла test.log:

    Код:
     
    03.12.2007 12:21:12 133 28 4735 1001 633  
    03.12.2007 12:21:12 128 26 4733 1022 628
    03.12.2007 12:21:13 123 24 4731 1115 623
    03.12.2007 12:21:13 126 22 4730 1100 626
    03.12.2007 12:21:14 127 21 4730 1011 627
    03.12.2007 12:21:14 125 23 4725 1000 625
    03.12.2007 12:21:15 124 25 4715 1000 624
    03.12.2007 12:21:15 122 27 4705 999 622
    03.12.2007 12:21:16 120 25 4715 991 620
    03.12.2007 12:21:16 119 20 4735 1001 619
    03.12.2007 12:21:17 115 22 4755 1051 615
    03.12.2007 12:21:17 119 26 4775 1021 619
    03.12.2007 12:21:18 120 29 4765 1012 620
    03.12.2007 12:21:18 123 27 4795 1016 623
    03.12.2007 12:21:19 129 29 4735 1000 629
    03.12.2007 12:21:19 133 25 4715 990 633
    03.12.2007 12:21:20 129 23 4705 1010 629
    03.12.2007 12:21:20 123 22 4695 1100 623
     

     
    Результат - совсем не тот, что ожидаю:

    Код:
     
    0 0 0  
    0 MIN=0 in . MAX=0 in . MID=0  
    MIN = 4695 in the line number  
    MAX = 4695 in the line number 0  
    MID = 260 in total lines 18  
     

     
    Подскажите - где моя ошибка???
     
    ?
     

    Всего записей: 32 | Зарегистр. 27-11-2007 | Отправлено: 10:51 07-12-2007
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    popalka
    Если сервис запущен, то ничего не произойдет; если остановлен, то запустится  

    Код:
     
    @echo off
    for /f "tokens=3" %%i in ('sc query "ServName" ^| findstr /i "state"') do (
        if %%i equ 4 goto:eof
        if %%i equ 1 sc start "ServName"
    )
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 11:13 07-12-2007 | Исправлено: 01MDM, 11:17 07-12-2007
    popalka



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    О, спасибо, то что нужно!

    Всего записей: 70 | Зарегистр. 25-06-2004 | Отправлено: 11:22 07-12-2007 | Исправлено: popalka, 11:22 07-12-2007
    Ilyansk

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

    Код:
    @echo off
    setlocal enabledelayedexpansion
    for /f "usebackq tokens=*" %%WORD in (`net start`) do call :razbor %%WORD
    echo Finished && goto :eof
    :again
    :razbor
    set "wrd=%1"
    if "!wrd!"=="" goto :eof
    if /I "!wrd!"=="ServiceName" (
    rem что-то делаем когда находим ServiceName
    ) else (
    shift
    goto :again
    )

     
    как-то так.  вместо rem ... вставьте команду, которая должна выполниться при обнаружении ServiceName. Учтите, net start обрамлен специальными кавычками, теми, что на кнопке "Ё" (Тильда)
     
    Добавлено:   Отредактировано
    SapSat

    Цитата:
    if %min%==0 set /a min=%%e

    ключ /а в команде set используется только для вычислений и в ней не надо обрамлять переменные %%
    в начале переменные инициализируйте так

    Код:
    set "min=1000000"
    set "max=-1000000"

    для выявления экстремумов используйте конструкции

    Код:
    if !e! lss !min! set "min=%%a"
    if !e! gtr !max! set "max=%%a"

    (если Вам нужно только одно значение из строки, то и укажите какое по номеру tokens=5, оно присвоится %%a)
    такой метод нахождения макс и мин значений (для %%а) будет правильным.
    А у Вас мах и мин всегда сравнивается с нулем...
    тут еще есть проблема с подстановкой значения переменных во время выполнения.
    При обрамелении переменной в восклицательные знаки берется ее текущее значение, а при %% - запаздывает на цикл. поэкспериментируйте с этим (см set /?) и в конце, расчет среднеарифметического
    set /a mid=(max-min)/i
    echo mid=!mid!
     
    в целом

    Код:
    @echo off  
    setlocal enabledelayedexpansion  
    set "i=0"  
    set "min=100000"  
    set "max=-100000"  
    set "mid=0"  
    echo processing 2>results1.txt    
    for /f "tokens=5" %%a in (test.log) do (  
    set /a i+=1  
    if !a! lss !min! set "min=%%a" & set imin=!i!
    if !a! gtr !max! set "max=%%a"  & set imax=!i!
    set /a mid=(max-min)/i
    echo !i! !min! !max! >>results1.txt  
    echo !i! MIN=!min! in !imin!. MAX=!max! in !imax!. MID=!mid! >>results1.txt  
    )  
    echo MIN = !min! in the line number !imin! >>results1.txt  
    echo MAX = !max! in the line number !imax! >>results1.txt  
    echo MID = !mid! in total lines !i! >>results1.txt

     
    как-то так. набирал по идее. надеюсь, отладите, раз уж Вы "окунулись" в FOR ...
    в качестве совета, ставьте внутри цикла pause и выполняйте таким образом батник по шагам  
    при показе на экране "Нажмите любую клавишу..."  батник можно прервать нажав Ctrl+Pause
    Успехов

    Всего записей: 70 | Зарегистр. 27-07-2006 | Отправлено: 11:28 07-12-2007 | Исправлено: Ilyansk, 08:43 10-12-2007
       

    Страницы: 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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 4
    evle (19-03-2008 19:44): Лимит страниц.
    Задачи на bat-файлах 5


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru