Войти

Показать полную графическую версию : [решено] Условия внутри цикла for


blackmane
01-08-2012, 10:44
Доброе утро!
Мне нужно на 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
Я не могу найти ошибку ((((((

gora
01-08-2012, 11:47
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 хотя переход на метку внутри цикла думаю не сработает

blackmane
01-08-2012, 14:48
СПС, правда ничего не получилось, скрипт выходил из цикла на 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, нужно чтобы при выходе из цикла включался другой, где начало - первое значение в файле шаг следующая строчка конец - конец файла.
Как то так.

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

blackmane
02-08-2012, 10:01
Сам решил ))))

@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 -говорит готово, идет дальше.




© OSzone.net 2001-2012