Форум программистов, компьютерный форум, киберфорум
Наши страницы

Batch (CMD/BAT)

Войти
Регистрация
Восстановить пароль
 
sundraw
2 / 2 / 1
Регистрация: 12.01.2017
Сообщений: 15
#1

Работа с двумя циклами с сохранением одного счётчика - CMD/BAT

15.12.2017, 20:23. Просмотров 167. Ответов 8
Метки нет (Все метки)

Есть батник
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@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\test.bat" 
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\test.bat"
IF ERRORLEVEL 0 GOTO begin
)
goto begin
Работает первый цикл со счётчиком от 1 до 10, направляющий исполнительные файлы в виртуальные машины %%i. Если с отправкой файла происходит ошибка, то идёт перенаправление во второй цикл от 1 до 2, где делаются две повторные попытки запуска. Если какая-то попытка завершилась успешно, то идёт возврат в первый цикл. Причём, если, к примеру, ошибка в цикле произошла на числовом порядке 4, то успешная команда должна вернуться в него, в 4-й, как исправленная, и первый цикл продолжается дальше. Если же во втором цикле (от 1 до 2) обе попытки выполнились с ошибкой, то эта ошибка должна направиться в текстовый файл с указанием номера, на котором произошла ошибка, то есть, если ошибка произошла на 4-м цикле, и не была исправлена, то в текстовый файл должна записаться цифра 4. При этом идёт возврат в первый цикл (1-10), но уже не на метку 4, а на следующую, 5. Прошу помочь с решением данного вопроса. Приветствуются другие варианты скриптов, выполняющих эту задачу. В указанном батнике не решены вопросы возврата цикла и перенаправления ошибочных в текстовый файл.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2017, 20:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Работа с двумя циклами с сохранением одного счётчика (CMD/BAT):

Работа с циклами - CMD/BAT
Пока вопрос такой: почему не работает? set length=0 for /f tokens^=*^ delims^=^ eol^= %%a in (%0) do ( set /a length += 1 echo...

Открытие одного окна Internet Explorer с двумя вкладками - CMD/BAT
Долго бьюсь над тем что бы Батник запускал именно ЭКСПЛОРЕР с двумя вкладками. не браузер по умолчанию, ни два отдельных раза эксплорер. а...

Различия между двумя циклами - C++
объясните различия между двумя следующими циклами while #include <iostream> using namespace std; int main () { const...

Степень всеми циклами и двумя рекурсиями - C++
#include <iostream.h> double degree1(double A, signed int n); double degree1(double A, unsigned int n); double degree2(double A,...

Заполнение html - таблицы двумя циклами - Ruby on Rails
Допустим есть два массива: 1. a = 2. b = Нужно генерить html - таблицу такого вида: |a|b| |1|4| |2|5| |3|6|

P16F876. Написать программу с двумя циклами - Микроконтроллер
Народ проблема такая , нужно написать программу чтоб в ней было 2 цикла в 1 ( decfsz ) есть прога где только 1 цикл .......может кто то...

8
alpap
1295 / 1026 / 329
Регистрация: 26.04.2015
Сообщений: 3,749
15.12.2017, 23:23 #2
sundraw,
какой-то такой бред написан, если честно.
запуск программы 10 раз подряд - это извращение или как? А потом при неудаче еще пару запусков вместо устранения проблемы (ошибки) или контроля и анализа

достаточно пустить при отсутствии ошибки и зациклить (в данном случае вручную через паузу, можно убрать) при ошибке до ее пропадания
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
@echo off
set proba=Proba
echo %proba%|>nul find "Proba"
:: echo %proba%|>nul find "NoProba"
:povtor
if "%errorlevel%"=="0" (
 echo zapusk proga.exe& pause& exit
) else (
 echo pause& pause& goto povtor
)
pause
все это просто пример, шевелите извилинами
0
sundraw
2 / 2 / 1
Регистрация: 12.01.2017
Сообщений: 15
16.12.2017, 05:40  [ТС] #3
alpap
Здесь не совсем бред, хотя Вы возможно, и правы. Подобный скрипт выполняет отправку (копирование) файлов, команд в виртуальные машины VirtualBox из хостовой машины. Здесь, например, происходит запуск одной команды "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestcontrol %%i execute --image "C:\Windows\test.bat" в 10-ть разных виртуальных машин %%i, их может быть и 100, и 1000. Зачем это нужно. Некоторые виртуальные машины в процессе работы выходят из строя, подвисают, подхватывают вирусы, сбой команд и т.п. Некоторые виртуалки находятся в процессе перезагрузки, когда их дополнения Extension Pack ещё не подключились. Вот для таких машин и нужны 2-3 попытки через паузы (метка :loop), чтоб их дополнения успели подключиться и принять нужную команду в файле test.bat. Если же все эти попытки безуспешны, то это свидетельствует о неисправности самой виртуалки или её дополнений. Номера таких машин %%i выводятся в отдельный текстовый файл, после чего в течение 2-х минут эти вышедшие из строя машины меняются на новые. Вышеуказанный скрипт, кроме того, что выполняет свои прямые функции по отправке команд и копированию файлов , папок в саму виртуалку, ещё и выявляет неисправные машины, которые в ручном порядке выявлять намного дольше.
А за скрипт спасибо, попробую с ним поработать.
1
YuS_2
Нарушитель
698 / 491 / 160
Регистрация: 10.03.2016
Сообщений: 1,149
16.12.2017, 09:29 #4
На другом форуме есть ответ. Но и здесь то же самое, на всякий случай:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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
2
sundraw
2 / 2 / 1
Регистрация: 12.01.2017
Сообщений: 15
16.12.2017, 10:26  [ТС] #5
YuS_2, на другом форуме мы пообщались. Скрипт работает отлично, даже больше моих ожиданий. Большое спасибо
0
alpap
1295 / 1026 / 329
Регистрация: 26.04.2015
Сообщений: 3,749
16.12.2017, 12:56 #6
Цитата Сообщение от YuS_2 Посмотреть сообщение
if errorlevel 1
может лучше не 0, не знаю могут ли быть другие кроме 1 ?

Добавлено через 1 минуту

Не по теме:

sundraw,
надо было вот так развернуто и писать задачу, не могут же все знать все утилиты и их команды

0
YuS_2
Нарушитель
698 / 491 / 160
Регистрация: 10.03.2016
Сообщений: 1,149
16.12.2017, 13:32 #7
Цитата Сообщение от alpap Посмотреть сообщение
может лучше не 0, не знаю могут ли быть другие кроме 1 ?
Там учтено, что могут быть другие коды:
if %errorlevel% equ 0 - ошибок нет
if errorlevel 1 - условие является истинным, если код возврата последней выполненной программы не меньше указанного числа.

Не по теме:

Цитата Сообщение от alpap Посмотреть сообщение
надо было вот так развернуто и писать задачу
там тоже пришлось немного "попытать", прежде чем человек "сознался"

2
sundraw
2 / 2 / 1
Регистрация: 12.01.2017
Сообщений: 15
16.12.2017, 14:00  [ТС] #8
alpap, YuS_2,
0
YuS_2
Нарушитель
698 / 491 / 160
Регистрация: 10.03.2016
Сообщений: 1,149
16.12.2017, 18:39 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
sundraw, в код выше, как оказалось, закралась ошибка, поправляю:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2017, 18:39
Привет! Вот еще темы с ответами:

Оптимизировать код с двумя схожими циклами - C#
Подскажите, пожалуйста, в кусочке программы, приведенном ниже, как сделать, чтобы не писать 2 раза одно и то же (имеется в виду строчки из...

2 запроса в базу данных с двумя циклами - PHP БД
Всем привет, может заголовок не так сформулировал но в общем не могу понять. как мне вытащить переменную $members из цикла while($members...

Модель цифрового счётчика (работа с портами) - AnyLogic
Всем доброго времени суток. Только начал изучать моделирование с помощью AnyLogic 7. Хотел создать простой пример с цифровым счетчиком....

Работа с циклами - C++
Помогите найти наименьший номер элемента последовательности, для которого выполняется условие M. Вывести на экран этот номер и все элементы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru