Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Условия внутри цикла for (http://forum.oszone.net/showthread.php?t=239745)

blackmane 01-08-2012 10:44 1962593

Условия внутри цикла 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
Я не могу найти ошибку ((((((

gora 01-08-2012 11:47 1962637

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 1962766

СПС, правда ничего не получилось, скрипт выходил из цикла на 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 1963027

Цитата:

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

Приведите здесь пример этого файла и пометьте в нем числа, которые следует считать в переменные begin, step, end

blackmane 02-08-2012 10:01 1963294

Сам решил ))))
Код:

@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.

Время: 17:30.
© OSzone.net 2001-