Что не так с командой 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 

   )
Другие вопросы по тегам