2016-10-26 3 views
0

Мне нужен способ либо не использовать оператор for, либо найти способ выйти из цикла, если условие выполнено.Итерация через текстовый файл с помощью пакетного скрипта без оператора

Вот что у меня сейчас ...

for /f "delims=" %%a in ('type pclist.txt') do (
    ping -n 1 %%a | findstr /i "reply" >nul 2>nul 
    if %errorlevel% equ 0 (
    if exist "\\%%a\c$\windows\temp\installed.txt" (
     echo %%a - Already installed >>results.txt 
    ) 
    if not exist "\\%%a\c$\windows\temp\installed.txt" (
     echo %%a - Not installed >>results.txt 
    ) 
) 
    ping -n 1 %%a | findstr /i "timed" >nul 2>nul 
    if %errorlevel% equ 0 echo %%a - No PING response >>results.txt 
    ping -n 1 %%a | findstr /i "transmit" >nul 2>nul 
    if %errorlevel% equ 0 echo %%a - PING transmit failed >>results.txt 
) 

Это дает мне такой результат ...

192.168.144.1 - Already installed 
192.168.144.1 - No PING response 
192.168.144.1 - PING transmit failure 
192 168.144.2 - Already installed 
192.168.144.2 - No PING response 
192.168.144.2 - PING transmit failure 
192.168.144.3 - Not installed 
192.168.144.3 - No PING response 
192.168.144.3 - PING transmit failure 

То, что я хотел бы сделать, это быть в состоянии выйти из для когда выполняется какое-либо первое условие. Таким образом, я бы такой результат вместо ...

192.168.144.1 - Already installed 
192 168.144.2 - Already installed 
192.168.144.3 - Not installed 

Я надеюсь, что я просто с видом что-то простое, и это будет просто еще одна из тех ошибок, I-D-10-T для меня. (lol)

Thanx заранее.


В простом английском. Вот эта цель:

Using FOR command, read list of IP addresses from text file. 
    For each IP address read, PING and check response. 
    If PING returns a reply, check for existence of file. 
     If file exists, 
     ECHO value 1 to results file, end FOR loop, proceed with next IP address in list. 
     If file does not exist, 
     ECHO value 2 to results file, end FOR loop, proceed with next IP address in list. 
    If PING does not return a reply, ECHO PING error text to results file, end FOR loop, proceed with next IP address in list. 

Надеюсь, это немного более понятно.

Thanx снова.

+0

Вы на самом деле не объяснить, если вы хотите, чтобы эти последние 4 строки кода, если работать на всех. Мои результаты ping не имеют слова ** timed ** или ** передачи **. Что вы пытаетесь сделать с этими результатами ping? – Squashman

+0

Я не понимаю вашего беспокойства; однако: ** 1. ** Команда 'goto' нарушает цикл' for/f'. ** 2. ** Вашему коду нужно использовать Delayed Expansion для доступа к '! Errorlevel!' Внутри цикла for, хотя в этом случае это необязательно: просто используйте 'if errorlevel 1 (' form (и измените код соответственно). – Aacini

+0

Простите, что.Возможные результаты PING, которые я могу получить, - это ... »Ответ от ip.add.re.ss: bytes = ## time = # ms TTL = ###" или "Ответить от ip.add.re.ss: Целевой узел недостижим «. или «Запрос Ping не смог найти хост ip.add.re.ss. Пожалуйста, проверьте имя и повторите попытку». или «Время ожидания запроса». или «PING: передача не удалась. Общий сбой». Поэтому я ищу эти результаты findstr выше. Основываясь на полученном результате ping, цель состоит в том, чтобы повторить инструкцию в файл. Теперь несколько эхо-сигналов появляются за пинг вместо одного и сделано. – user3208239

ответ

1

Чтобы избежать вложенных блоков кода IF/Else, вы должны использовать subs с вызовами. Использование C:\windows\temp также может быть проблемой при перенаправлении на C:\Users\%USERNAME%\AppData\Local\Temp. TTL - лучший индикатор для ping-less в зависимости от локали.

@Echo off 
Set Res=^>^>Results.txt 
Echo %date% %time% %Res:~1% 
Set Inst=Windows\temp\installed.txt 
for /f "delims=" %%a in ('type pclist.txt') do Call :TestPC %%a 
Type %Res:~2% 
Goto :Eof 

:TestPC 
ping -n 1 -w 500 %1|findstr "TTL">nul 2>&1||(Call :Check %1 &Goto :Eof) 
:: A rights Problem might exist 
if  exist "\\%1\c$\%Inst%" echo %1 - Already installed %Res% 
if not exist "\\%1\c$\%Inst%" echo %1 - Not installed %Res% 
Goto :Eof 

:Check 
ping -n 1 -w 500 %1 | findstr /i "timed" >nul 2>nul 
if %errorlevel% equ 0 %Res% echo %1 - No PING response 
ping -n 1 -w 500 %1 | findstr /i "transmit" >nul 2>nul 
if %errorlevel% equ 0 %Res% echo %1 - PING transmit failed 
Goto :Eof 

возвращает этот выход

Mi 10/26/2016 17:46:35,78 
192.168.3.91 - Not installed 
192.168.3.95 - No PING response 
192.168.3.92 - Already installed 
+0

Это сработало отлично! Большое спасибо, LotPings! – user3208239

0
if %errorlevel% equ 0 (

(используется несколько раз) - %errorlevel% относится к значению errorlevelв то время как для разобранного не во время выполнения. Вам нужно заменить

if not errorlevel 1 

в каждом конкретном случае, чтобы обеспечить требуемую функциональность (если время выполнения Равен нет (1 или более))

Таким образом, вы «образец токовый выход» является фальшивкой - вы не можете получить этот вывод с кодом, который вы указали как %errorlevel%, не будет изменяться с каждым циклом. Кроме того, ваш образец показывает «сбой», тогда как код указывает «сбой».

Что вы подразумеваете под whatever first condition is met? Вы можете получить предлагаемый вывод, просто удалив или закомментировав 4 строки после закрытия вашего заявления if.

+0

Я изменил OP с (надеюсь) лучшим объяснением. Thanx. – user3208239

Смежные вопросы