Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
sundraw
2 / 2 / 2
Регистрация: 12.01.2017
Сообщений: 21
#1

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

15.12.2017, 20:23. Просмотров 786. Ответов 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
Ответы с готовыми решениями:

Работа с циклами
Пока вопрос такой: почему не работает? set length=0 for /f tokens^=*^...

Перенос текстов из одного xml файла в другой с сохранением последовательности
Здравствуйте. Помогите пожалуйста с переводом одной программки. ...

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

Различия между двумя циклами
объясните различия между двумя следующими циклами while #include <iostream>...

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

8
alpap
1384 / 1115 / 361
Регистрация: 26.04.2015
Сообщений: 3,980
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 / 2
Регистрация: 12.01.2017
Сообщений: 21
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
Любознательный
715 / 508 / 168
Регистрация: 10.03.2016
Сообщений: 1,192
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 / 2
Регистрация: 12.01.2017
Сообщений: 21
16.12.2017, 10:26  [ТС] #5
YuS_2, на другом форуме мы пообщались. Скрипт работает отлично, даже больше моих ожиданий. Большое спасибо
0
alpap
1384 / 1115 / 361
Регистрация: 26.04.2015
Сообщений: 3,980
16.12.2017, 12:56 #6
Цитата Сообщение от YuS_2 Посмотреть сообщение
if errorlevel 1
может лучше не 0, не знаю могут ли быть другие кроме 1 ?

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

Не по теме:

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

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

Не по теме:

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

2
sundraw
2 / 2 / 2
Регистрация: 12.01.2017
Сообщений: 21
16.12.2017, 14:00  [ТС] #8
alpap, YuS_2,
0
YuS_2
Любознательный
715 / 508 / 168
Регистрация: 10.03.2016
Сообщений: 1,192
16.12.2017, 18:39 #9
Лучший ответ Сообщение было отмечено sundraw как решение

Решение

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
16.12.2017, 18:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2017, 18:39

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

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

2 запроса в базу данных с двумя циклами
Всем привет, может заголовок не так сформулировал но в общем не могу понять....


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

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

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