 |
|
Условия внутри цикла for
Доброе утро!
Мне нужно на 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
Я не могу найти ошибку ((((((
|
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
хотя переход на метку внутри цикла думаю не сработает
|
СПС, правда ничего не получилось, скрипт выходил из цикла на 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
по прохождении вышеукзанного будет создавться файл со значениями не доступных %%i, нужно чтобы при выходе из цикла включался другой, где начало - первое значение в файле шаг следующая строчка конец - конец файла. »
|
Приведите здесь пример этого файла и пометьте в нем числа, которые следует считать в переменные begin, step, end
|
Сам решил ))))
Код:
@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 -говорит готово, идет дальше.
|
Время: 17:30.
© OSzone.net 2001-