Что не так с командой goto в цикле for?
У меня есть список компьютеров, которые я хочу сделать некоторые вещи в зависимости от состояния соединения TCP.
Я пытаюсь проверить соединение TCP, и если errorlog равен "1", напишите строку для входа и перейдите к следующему компьютеру.
Проблема в том, что, когда у компьютера нет TCP-соединения, goto skip_action
Команда переводит скрипт в конец и завершается, а остальные компьютеры в списке остаются необработанными. Я также пытался использовать goto :eof
и это завершает сценарий неожиданно.
ipst.txt file:
1 10.1.1.10
3 10.1.3.10
8 10.1.3.10
Это код командного файла:
@echo off
setlocal enabledelayedexpansion
set computerslist=ipst.txt
for /f "usebackq tokens=1,2" %%A in ("%Computerslist%") do (
cls
set Station_Num=%%A
set Comp_IP=%%B
ping !Comp_IP! -n 1 | findstr "TTL"
if !errorlevel!==1 (
echo Station !Station_Num! .... !Comp_IP! ..................... No Communication.>>%log%
goto skip_action
)
echo Getting Administrator Credentials:
net use \\!Comp_IP! /USER:WORKGROUP\****** ******
echo.
xcopy file.txt \\!Comp_IP!\c\temp\
echo Disconneting Session From Remote Computer :
net use \\!Comp_IP! /DELETE /YES
:skip_action
echo end of working on !Station_Num!
)
echo end of script
3 ответа
Проблема здесь в том, что GOTO отменяет цикл for.
Но вы можете просто заключить свое действие в блок ELSE
for /f "usebackq tokens=1,2" %%A in ("%Computerslist%") do (
cls
set Station_Num=%%A
set Comp_IP=%%B
ping !Comp_IP! -n 1 | findstr "TTL"
if !errorlevel!==1 (
echo Station !Station_Num! .... !Comp_IP! ..................... No Communication.>>%log%
) Else (
echo Getting Administrator Credentials:
net use \\!Comp_IP! /USER:WORKGROUP\****** ******
echo.
xcopy file.txt \\!Comp_IP!\c\temp\
echo Disconneting Session From Remote Computer :
net use \\!Comp_IP! /DELETE /YES
)
echo end of working on !Station_Num!
)
Сделай свой звонок из цикла
Вы можете иметь функцию ping.. и анализировать переменные ссылки на нее.. предыдущий код также может быть представлен как %% a и %% b, являющийся первым и вторым аргументом соответственно - в вашем вызове функции...
Call :pingcomputers %%a %%b
Таким образом, вы избегаете установки в целом
:pingcomputers
Рем Пинг компьютер%~1
Ping %~2 ¦ find "reply"
If errorlevel 1 goto failed
(Actions to be performed if ping wa successful)
Предполагая, что у вашего скрипта есть метка не удалось, и действия to.be выполняются, если уровень ошибки не равен 0 ..
Не большая часть сценария, но надеюсь, что это поможет...
Общая форма оператора if - else
If condition (
Statements
) else (
Statements to be executed if condition is not met
)