CMD/BAT - [решено] Условия внутри цикла for

Ответить
Аватара пользователя
blackmane

CMD/BAT - [решено] Условия внутри цикла for

Сообщение blackmane »

Доброе утро!

Мне нужно на 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

Re: CMD/BAT - [решено] Условия внутри цикла for

Сообщение gora »

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

Re: CMD/BAT - [решено] Условия внутри цикла for

Сообщение gora »

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

Re: CMD/BAT - [решено] Условия внутри цикла for

Сообщение gora »

Цитата blackmane:



по прохождении вышеукзанного будет создавться файл со значениями не доступных %%i, нужно чтобы при выходе из цикла включался другой, где начало - первое значение в файле шаг следующая строчка конец - конец файла.
CMD/BAT - [решено] Условия внутри цикла for




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

Re: CMD/BAT - [решено] Условия внутри цикла for

Сообщение blackmane »

Сам решил ))))



Код:

Код: Выделить всё

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

Вернуться в «Скриптовые языки администрирования Windows»