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

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

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

KLASS (06-03-2018 00:44): Объединение тем по сценариям: Сценарии Windows
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

hErAx

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

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

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

  • Отправлено: 01:53 25-10-2015 | Исправлено: Paromshick, 21:51 18-12-2017
    YuS_2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sundraw
    1. Разбираться надо с вопросом почему команда не срабатывает с первого раза, а не костыли с непредсказуемым результатом ваять.
    2. %var%-переменные внутри скобок принимают значение, которое они имели до входа внутрь скобок. А для получения правильного значения необходимо использовать !-раскрытие, т.е. отложенное раскрытие переменных: SETLOCAL /?
    3. errorlevel проверяется непосредственно после необходимой команды, у Вас это команда ping на localhost, т.е. всегда будет равно 0... зачем?
    4. Внутри циклов не рекомендуется осуществлять переход по меткам командой goto.

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 15:30 15-12-2017 | Исправлено: YuS_2, 15:31 15-12-2017
    sundraw

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

    Цитата:
     
    1. Разбираться надо с вопросом почему команда не срабатывает с первого раза, а не костыли с непредсказуемым результатом ваять.
    2. %var%-переменные внутри скобок принимают значение, которое они имели до входа внутрь скобок. А для получения правильного значения необходимо использовать !-раскрытие, т.е. отложенное раскрытие переменных: SETLOCAL /?
    3. errorlevel проверяется непосредственно после необходимой команды, у Вас это команда ping на localhost, т.е. всегда будет равно 0... зачем?
    4. Внутри циклов не рекомендуется осуществлять переход по меткам командой goto.  

    1. Команда не срабатывает по причинам, связанных с работой VirtualBox и её Extension Pack. Происходят периодические подвисания некоторых виртуальных машин по разным причинам, не для данной темы. Этот скрипт имеет более "расширенное" значение: с его помощью выявляются машины с зависшими дополнениями, которые вручную выявлять будет посложнее. Также скрипт может не отрабатывать с первого раза в виртуалках, находящихся в процессе перезагрузки, когда дополнения ещё не подключились. Тогда надо его отработать пару-тройку раз через паузу, пока не подключатся дополнения. Если и тогда скрипт выдаст ошибку, то виртуалку можно считать безвозвратно зависшей, номера таких машин должны отобразиться в текстовом файле, и я уже буду знать, сколько машин "отвалилось" и требуют замены.
    2.3.4 Спасибо за Ваши подсказки, благодаря им я исправил ошибки со счётчиками, цикл работает как надо.
    5. Осталось разобраться с перенаправлением "неисправляемых" ошибок в текстовый файл и возвратом в продолжение первого цикла.
     

    Всего записей: 837 | Зарегистр. 15-05-2011 | Отправлено: 18:23 15-12-2017 | Исправлено: sundraw, 18:29 15-12-2017
    YuS_2



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

    Цитата:
    5. Осталось разобраться с перенаправлением "неисправляемых" ошибок в текстовый файл и возвратом в продолжение первого цикла.

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

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 00:59 16-12-2017
    sundraw

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2
    Исправленный пакетник:

    Код:
     
    @echo off  
    setlocal enabledelayedexpansion
    set var=  
    set /a var=1
    for /l %%i in (1,1,10) do (
    :begin
    "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol %%i execute --image "C:\Windows\RestartPC.bat" --username Admin --password 1 --recursive
    IF ERRORLEVEL 1 GOTO loop
    echo count !var!  
    set /a var+=1
     
    )
    exit
     
    :loop
     for /l %%i in (1,1,2) do (
    "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol %%i execute --image "C:\Windows\RestartPC.bat" --username Admin --password 1 --recursive
    IF ERRORLEVEL 0 GOTO begin
     
    )
    goto begin
     
     

    Счётчик в 1-м цикле теперь работает исправно. Вначале считал, что его задача "сохранять своё место" при переходах с одного цикла на другой, но может это и не понадобится. Что осталось сделать, постараюсь объяснить поподробнее. Здесь в первом цикле (1-10) под номерами %%i - номера виртуальных машин VirtualBox, в данном случае, здесь 10 разных виртуальных машин, в которые поочерёдно  посылаются одинаковые команды RestartPC.bat из основной (хостовая, управляющая, железо) машины.
     Если с отправкой команды происходит ошибка, то работа проблемной машины должна перенаправиться во второй цикл с меткой :loop от 1 до 2, где переменная %%i уже означает количество попыток перезапуска команды в проблемной ВМ. Вот только надо как-то связать количество попыток (:loop) и проблемную машину. В данном случае делаются две такие попытки. Если какая-то одна из двух попыток завершилась успешно, то об этом как-то нужно сообщить, желательно, в сообщении должен стоять номер "исправленной" машины. Сам первый цикл можно не останавливать, пусть идёт своим ходом дальше.  Если же во втором цикле (:loop) обе попытки выполнились с ошибкой, то эта ошибка должна направиться в текстовый файл с указанием номера, на котором произошла ошибка, то есть, если ошибка произошла на 4-м цикле, и не была исправлена, то в текстовый файл (к примеру ErrorVM.txt) должна записаться цифра 4, как номер(название) проблемной машины. Вот, пожалуй, и всё. Затем проблемные виртуальные машины из ErrorVM.txt я вношу на замену уже в другой скрипт, и за 5-10 минут их меняю на новые.  
     
    P.S. Как я справляюсь с подобными ошибками сейчас, для ясности. Запускаю первый цикл из указанного скрипта только с одной командой "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol %%i execute --image "C:\Windows\RestartPC.bat" --username Admin --password 1 --recursive, ну ещё с паузой, и смотрю, когда выпадет ошибка в процессе работы. Вместо файла RestartPC.bat может быть совершенно любой и с разными задачами. Как только в какой-то из виртуалок происходит ошибка, я параллельно открываю точно такой же скрипт, но уже вручную вношу нужные номера в цикл, к примеру for /l %%i in (8,1,8), если ошибку выдала 8-я машина,и делаю столько попыток запуска, сколько понадобится. Запустилась - хорошо, не запустилась - на замену. Так вот, вышеприведённый скрипт должен автоматизировать этот процесс. Для примера я указал 10 машин, но их гораздо больше, поэтому и нужна автоматизация.
     

    Всего записей: 837 | Зарегистр. 15-05-2011 | Отправлено: 07:04 16-12-2017 | Исправлено: sundraw, 08:56 16-12-2017
    YuS_2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sundraw
    Вот, теперь, что-то более-менее прояснилось:

    Код:
    @echo off
    setlocal
    set var=
    for /l %%i in (1,1,10) do (
        set var=%%i
        "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol %%i execute --image "C:\Windows\RestartPC.bat" --username Admin --password 1 --recursive
        if errorlevel 1 (>>ErrorVM.txt echo.%date% %time%: Обнаружена ошибка запуска, машина N'%%i'&call :loop)
        echo.%date% %time%: Запуск контроля выполнен, машина: N'%%i'
    )
    pause&exit /b
     
    :loop
     for /l %%a in (1,1,2) do (
        "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol %var% execute --image "C:\Windows\RestartPC.bat" --username Admin --password 1 --recursive
        if %errorlevel% equ 0 (>>ErrorVM.txt echo.%date% %time%: Исправлена ошибка на попытке N'%%a', машина N'%var%'&exit /b)
    )
    >>ErrorVM.txt echo.%date% %time%: Ошибка не исправлена, машина N'%var%'
    exit /b

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 08:45 16-12-2017 | Исправлено: YuS_2, 08:52 16-12-2017
    sundraw

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2
    Всё работает отлично и как надо, даже больше, чем ожидал. Большое спасибо.

    Всего записей: 837 | Зарегистр. 15-05-2011 | Отправлено: 09:47 16-12-2017 | Исправлено: sundraw, 10:10 16-12-2017
    sundraw

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2
    В цикле :loop у меня почему-то срабатывает полный цикл. То есть, если после первого срабатывания второе уже не нужно, и должен быть возврат в первый цикл. А у меня пока все два не отработает, а потом только идёт возврат. Ставил 5 циклов, он все 5 и отрабатывает, хотя после первого должен быть возврат. Можно ли это как-то исправить?
    Может, это я что-то не то делаю. Для тестирования скрипта сделал так. В первом цикле установил несуществующий конечный файл, типа заменил RestartPC.bat на блабла.bat. При отработке в первом цикле он выдал ошибку и, как и задумано, направил действие во второй цикл. Там уже стоит настоящий действующий  Restart.bat. Там скрипт отрабатывает его без ошибки первый раз, и вот после этого должен быть возврат в первый цикл. Но он также без ошибки отрабатывает и второй раз, и только после этого уходит в первый цикл. Может я где-то в тестировании допускаю ошибку.

    Всего записей: 837 | Зарегистр. 15-05-2011 | Отправлено: 16:53 16-12-2017 | Исправлено: sundraw, 17:19 16-12-2017
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sundraw
    Лучше всего вообще отказаться об блоков, и вместо  

    Код:
    for /l %%i in (1,1,10) do (
    ....
    )

    использовать

    Код:
    set /a i=0
    :_1
    .....
    set /a i+=1
    if %i% LSS 10 goto _1

     
    Код менее красивый, но он позволит избежать многих ошибок, связанных с незнанием особенностей блоков, плюс к этому goto будет корректно работать и от call можно отказаться.
    Imxo.

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 17:17 16-12-2017
    sundraw

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Заменил второй цикл :loop указанным Вами способом, первый оставил как есть, один раз сработал, как надо, после первого нажатия. Дальнейшие запуски скрипта - только ошибки. Да, там в коде не %i%, а наверно %%i. Впрочем и это не помогло.

    Всего записей: 837 | Зарегистр. 15-05-2011 | Отправлено: 17:58 16-12-2017 | Исправлено: sundraw, 17:59 16-12-2017
    YuS_2



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

    Цитата:
    В цикле :loop у меня почему-то срабатывает полный цикл.

    Да, верно, это моя ошибка... NIKZZZZ, правильно подсказывает, надо либо от скобок отказаться в части :loop, либо отложенное раскрытие переменных использовать. Как-то упустил этот момент, без реальной проверки кода...
    Вот так попробуйте:

    Код:
    @echo off
    setlocal enabledelayedexpansion
    set var=
    for /l %%i in (1,1,10) do (
        set var=%%i
        "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol %%i execute --image "C:\Windows\RestartPC.bat" --username Admin --password 1 --recursive
        if errorlevel 1 (>>ErrorVM.txt echo.!date! !time!: Обнаружена ошибка запуска, машина N'%%i'&call :loop)
        echo.!date! !time!: Запуск контроля выполнен, машина: N'%%i'
    )
    pause&exit /b
     
    :loop
     for /l %%a in (1,1,2) do (
        "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol %var% execute --image "C:\Windows\RestartPC.bat" --username Admin --password 1 --recursive
        if !errorlevel! equ 0 (>>ErrorVM.txt echo.!date! !time!: Исправлена ошибка на попытке N'%%a', машина N'%var%'&exit /b)
    )
    >>ErrorVM.txt echo.%date% %time%: Ошибка не исправлена, машина N'%var%'
    exit /b

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 18:36 16-12-2017 | Исправлено: YuS_2, 08:32 17-12-2017
    sundraw

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

    Всего записей: 837 | Зарегистр. 15-05-2011 | Отправлено: 19:35 16-12-2017
    sundraw

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2
    Испытал Ваш скрипт, так сказать, в боевых условиях. Эффект потрясающий. Из 400 машин около 20-ти выдали ошибки входа в виртуалки. Если раньше устранял эти ошибки вручную, то сейчас просто смотрел. Из этих 20-ти 19 отработали через :loop с первого раза, и только одна со второго. И ни одной фатальной ошибки. Для удобства я немного причесал скрипт. Вот примерно так его работа выглядит в командной строке:


    Всего записей: 837 | Зарегистр. 15-05-2011 | Отправлено: 22:12 16-12-2017 | Исправлено: sundraw, 22:33 16-12-2017
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Может кому пригодится, моя утилита, расширяющая возможности батников.

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 00:20 17-12-2017
    thejustsoul



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Интересная штука. В readme добавьте адрес страницы, где можно будет качать обновления, а то забудется со временем и придется гуглить. И\или код бы на гитхаб с релизами -)
    P.S. Баг наверно.. Не запускается батник (test#.cmd), если он оканчивается на .cmd, проверьте.
    Совсем без мерцаний никак не запустить скрипт?

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 06:04 17-12-2017 | Исправлено: thejustsoul, 06:10 17-12-2017
    Start



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Спасибо. Интересная утилита.
    ConX.exe
    ConX_x64.exe
    Скажите, можно ли использовать ConX.exe как универсальную для систем X32 и X64? (Для скрытия и для паузы.)

    Всего записей: 634 | Зарегистр. 28-01-2006 | Отправлено: 06:42 17-12-2017
    NIKZZZZ



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

    Цитата:
    P.S. Баг наверно.. Не запускается батник (test#.cmd), если он оканчивается на .cmd, проверьте.  

    Не баг, поддерживается только расширение .bat

    Цитата:
    Совсем без мерцаний никак не запустить скрипт?

    К сожалению, нет, если только запускать батник через Conx.exe /hiderun

    Цитата:
    Скажите, можно ли использовать ConX.exe как универсальную для систем X32 и X64? (Для скрытия и для паузы.)

    Можно, но надо учитывать особенности x64 системы, например Conx.exe /hiderun proga.bat запустит c:\Windows\SysWOW64\cmd.exe , а ConX_x64.exe запустит c:\Windows\System32\cmd.exe.
     
     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 07:47 17-12-2017
    thejustsoul



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

    Цитата:
    Не баг, поддерживается только расширение .bat  

    Добавить cmd нельзя? Почему только bat? По-поводу github, не планируете туда выкладывать?

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 09:04 17-12-2017
    VitaminP



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

    Цитата:
    Совсем без мерцаний никак не запустить скрипт?

    эта https://yadi.sk/d/bwIxGLhPbeB9X утилита скроет скрипт или консольную прогу (параметр для утилиты - скрываемый скрипт)

    Всего записей: 306 | Зарегистр. 28-08-2013 | Отправлено: 09:44 18-12-2017
    Start



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VitaminP Имелось ввиду, что батник скрывает сам себя.
    Пример: после запуска батника окно консоли появится на мгновение и скроется, затем через 5 секунд запустится калькулятор.

    Код:
    @echo off
    cd /d %0\..
    ConX.exe hide
    ConX.exe sleep 5000
    start calc.exe
    @cls

    Ещё есть утилита, которая тоже позволяет скрыть консоль (скрыть окно батника), она похожа на Вашу, нашел здесь.
    Размер файла "hidec.exe": 1,50 КБ (1 536 байт)!
    Работает от Вин 98 и выше.
    Использование: hidec Прога.bat
    Размер архива: 2,33 КБ (2 390 байт)
    Скачать

    Цитата:
    Код зазипован вместе с бинарником
    Компиляция из ком. строки:
    Код:
    cl hidec.cpp /GA /O1 /link /subsystem:windows kernel32.lib advapi32.lib user32.lib

    Всего записей: 634 | Зарегистр. 28-01-2006 | Отправлено: 10:12 18-12-2017 | Исправлено: Start, 13:13 19-12-2017
    thejustsoul



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VitaminP
    Это понятно, что другими утилитами можно, вопрос про ConX был -)
    Start
    Этой в основном и пользовался, только брал ее отсюда (хеш с вашей совпал из архива).
    Есть еще hidecon и hideexec. Вдруг интересно будет.
    ConX заинтересовала тем, что у нее можно как скрывать, так и показывать консольной окно, например во время ошибки батника, удобно. Ну и эффекты различные..

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 11:08 18-12-2017 | Исправлено: thejustsoul, 11:15 18-12-2017
       

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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 12
    KLASS (06-03-2018 00:44): Объединение тем по сценариям: Сценарии Windows


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru