Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Условия внутри цикла for

Ответить
Настройки темы
CMD/BAT - [решено] Условия внутри цикла for

Аватара для blackmane

Пользователь


Сообщения: 69
Благодарности: 0


Конфигурация

Профиль | Отправить PM | Цитировать


Доброе утро!
Мне нужно на 120 ПК включить службу сообщений (одноранговая сеть), решил сделать батник с использованием утилит Русимовича, но видно где то допустил ошибку:
Код: Выделить весь код
for /l %%i in (50,1,248) do (
echo PC: 192.168.1.%%i
rem Определение  доступности узла
rem errorlevel=1 - узел не доступен
rem errorlevel=0 - узел доступен
ping -n 1 192.168.1.%%i | find /I "TTL=" || echo PC: 192.168.1.%%i %ERRORLEVEL%^=1 >>%OUTPUTOFF%
echo PC: 192.168.1.%%i >>%OUTPUT%
rem Определение доступности узла на уровне PsTools
rem errorlevel <> 0 - узел не доступен
rem errorlevel=0 - узел доступен
psservice \\192.168.1.%%i  -u %login% -p %pass% query Messenger >>%OUTPUT%
if %errorlevel%=="0" goto service
:service
echo PC: 192.168.1.%%i >>%OUTPUTAUTO%
rem переключение службы в автоматический режим
psservice \\192.168.1.%%i  -u %login% -p %pass% SETCONFIG Messenger auto >>%OUTPUTAUTO%
rem запуск службы
psservice \\192.168.1.%%i  -u %login% -p %pass% start Messenger >>%OUTPUTSTART%
echo PC: 192.168.1.%%i %errorlevel% >>%OUTPUTSTART%
)
errorlevel возвращает 0:
Код: Выделить весь код
Недоступные узлы:
PC: 192.168.1.50 0=1 
PC: 192.168.1.55 0=1 
PC: 192.168.1.56 0=1 
PC: 192.168.1.58 0=1 
PC: 192.168.1.59 0=1
Доступные узлы:
PC: 192.168.1.51 0=0
PC: 192.168.1.52 0=0 
PC: 192.168.1.53 0=0 
PC: 192.168.1.54 0=0 
PC: 192.168.1.238 0=0
Если я в конце 6 строки ставлю ")" - он завершает цикл на этой строке во всех случаях.
Если я вместо
Код: Выделить весь код
#6 ping -n 1 192.168.1.%%i | find /I "TTL=" || echo PC: 192.168.1.%%i %ERRORLEVEL%^=1 >>%OUTPUTOFF%
ставлю
Код: Выделить весь код
#6 ping -n 1 192.168.1.%%i | find /I "TTL=" || goto end
...
#20 :end
#21 echo PC: 192.168.1.%%i %ERRORLEVEL%^=1 >>%OUTPUTOFF%
#22 ) rem завершение цикла
То он на первом же пинге (узел заведомо недоступен) завершает батник, а в файл лога записывает:
Код: Выделить весь код
PC: 192.168.1.%i 1=1
Я не могу найти ошибку ((((((

Отправлено: 10:44, 01-08-2012

 

Аватара для gora

Ушёл из жизни


Сообщения: 6021
Благодарности: 3491

Профиль | Отправить PM | Цитировать


blackmane, добавьте в начало скрипта строку:
Код: Выделить весь код
SetLocal EnableDelayedExpansion
Надеюсь, что переменные (%OUTPUTOFF% %OUTPUT% и т.д.) у Вас где-то в начале скрипта тоже определены)
Эту строку:
Код: Выделить весь код
ping -n 1 192.168.1.%%i | find /I "TTL=" || echo PC: 192.168.1.%%i %ERRORLEVEL%^=1 >>%OUTPUTOFF%
запишите так:
Код: Выделить весь код
ping -n 1 192.168.1.%%i | find /I "TTL=" || echo PC: 192.168.1.%%i !ERRORLEVEL!=1 >>%OUTPUTOFF%
Эта строка тоже неправильно написана:
Код: Выделить весь код
if %errorlevel%=="0" goto service
попробуйте так:
Код: Выделить весь код
if "!errorlevel!"=="0" goto service
хотя переход на метку внутри цикла думаю не сработает

Последний раз редактировалось gora, 01-08-2012 в 11:54.

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:47, 01-08-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для blackmane

Пользователь


Сообщения: 69
Благодарности: 0

Профиль | Отправить PM | Цитировать


СПС, правда ничего не получилось, скрипт выходил из цикла на 51 значении, сделал не много по другому:
Код: Выделить весь код
@echo off
chcp 1251
set psservice=psservice
set pass=пасс
set login=логин
for /l %%i in (50,1,248) do (
echo Обработка 192.168.1.%%i... 
ping -n 1 192.168.1.%%i &&^
echo Обработка 192.168.1.%%i... >>log.txt &&^
%psservice% \\192.168.1.%%i  -u %login% -p %pass% query Messenger >>log.txt &&^
%psservice% \\192.168.1.%%i  -u %login% -p %pass% SETCONFIG Messenger auto >> log.txt &&^
%psservice% \\192.168.1.%%i  -u %login% -p %pass% start Messenger && echo OK >> log.txt ||^
echo %date% %time% PC:192.168.1.%%i - not connected >> logoff.txt
)
exit
Никаких наворотов, а так хотелось автоматизировать ((((
Может кто подскажет, а как сделать так, чтобы for (начало шаг конец) выбирался из текстового файла????, т.е. по прохождении вышеукзанного будет создавться файл со значениями не доступных %%i, нужно чтобы при выходе из цикла включался другой, где начало - первое значение в файле шаг следующая строчка конец - конец файла.
Как то так.

Последний раз редактировалось blackmane, 01-08-2012 в 15:00.


Отправлено: 14:48, 01-08-2012 | #3


Аватара для gora

Ушёл из жизни


Сообщения: 6021
Благодарности: 3491

Профиль | Отправить PM | Цитировать


Цитата blackmane:
по прохождении вышеукзанного будет создавться файл со значениями не доступных %%i, нужно чтобы при выходе из цикла включался другой, где начало - первое значение в файле шаг следующая строчка конец - конец файла. »
Приведите здесь пример этого файла и пометьте в нем числа, которые следует считать в переменные begin, step, end
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:52, 01-08-2012 | #4


Аватара для blackmane

Пользователь


Сообщения: 69
Благодарности: 0

Профиль | Отправить PM | Цитировать


Сам решил ))))
Код: Выделить весь код
@echo off
chcp 1251
set psservice=psservice
set pass=пасс
set login=логин
set OUT=hi_%date%_log.txt
set OUToff=hi_%date%_logoff.txt
set OUTOK=%date%_log.txt
set iptxt=ip.txt
for /l %%i in (50,1,248) do (
SetLocal EnableDelayedExpansion
echo Обработка 192.168.1.%%i... 
find /I  ".%%i" ip.txt >nul
if !errorlevel!==1 (ping -n 1 192.168.1.%%i &&^
echo Обработка 192.168.1.%%i... >>!OUT! &&^
!psservice! \\192.168.1.%%i  -u !login! -p !pass! query Messenger >>!OUT! &&^
!psservice! \\192.168.1.%%i  -u !login! -p !pass! SETCONFIG Messenger auto >> !OUT! &&^
!psservice! \\192.168.1.%%i  -u !login! -p !pass! start Messenger && echo OK >> !OUT!  && echo 192.168.1.%%i - OK >>!OUTOK! && echo %%i>>!iptxt! ||^
echo !date! !time! PC:192.168.1.%%i - not connected >> !OUToff!) else (echo DONE!)
endLocal
)
exit
При удачном завершении в файл ip.txt записывается только значение ".%%i", и при следующем запуске если совпадает ".%%i" с ip.txt -говорит готово, идет дальше.

Отправлено: 10:01, 02-08-2012 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Условия внутри цикла for

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Как работать с переменной внутри цикла FOR? alex_past Скриптовые языки администрирования Windows 42 28-11-2018 16:19
BSOD - Замучил синий екран смерти (см внутри) BCCode: a Код языка: 1049 + внутри доп вопрос Alexeydt Тест-форум 2 14-04-2012 16:44
CMD/BAT - Проверка условия Доктор Ливси Скриптовые языки администрирования Windows 11 19-01-2012 16:01
CMD/BAT - Условия на удоления в cmd zinteco Скриптовые языки администрирования Windows 1 24-03-2010 19:58
Разное - Льготные условия приобретения Windows 7 okshef Microsoft Windows 7 1 25-01-2009 22:14




 
Переход