Проблема FOR / F, запущенная из текстового файла + счет - PullRequest
0 голосов
/ 21 февраля 2011

Вот что я борюсь с:

Title Scanning online computers: && set /a title_count=0
call :next


:next
FOR /F "tokens=1" %%a IN (workstation.txt) do (
title Scanning for online computers: %title_count% / %workstation%
ping -n 1 %%a | find "bytes=" >nul
set /a title_count=title_count+=1

if NOT ERRORLEVEL 1 (
set color=%%a && call includes\what.bat %color_pass% && echo %%a >> logs\reachable.txt
) else ( 
set color=%%a && call includes\what.bat %color_fail% && echo %%a >> logs\unreachable.txt && echo %%a, offline, %     date%, %time% >> logs\offline.txt
)
)

Проблема, с которой я столкнулся, заключается в том, что функция TITLE не обновляется, пока переменная% count_title% выполняет обратный отсчет в скрипте.

set /a title_count+=1 

тоже не работает

Отображается как:

 Scanning for online computers 0 / 5

Может кто-нибудь сказать мне, что я здесь делаю не так?

Заранее спасибо.

Illusion

Привет

Я пробовал это так, как предлагалось: Он завершает оставшуюся часть сценария при использовании последнего GOTO: EOF Это не имеет смысла для меня, если я удаляю последний GOTO: eof, только первая строка в workstation.txt обрабатывается / анализируется.

       Scanning online computers: && set /a title_count+=1`
       call :next
       ::added as possibly missing
       GOTO :EOF

       :next
        FOR /F "tokens=1" %%a IN (workstation.txt) DO CALL :pingstation %%a
        GOTO :EOF

        :pingstation
        title Scanning for online computers: %title_count% / %workstation%
        ping -n 1 %1 | find "bytes=" >nul
        set /a title_count+=1

        if NOT ERRORLEVEL 1 (
        set color=%1 && call includes\what.bat %color_pass% && echo %1 >> logs\reachable.txt
        ) else ( 
         set color=%1 && call includes\what.bat %color_fail% && echo %1 >> logs\unreachable.txt && echo %1, offline, %date%, %time% >> logs\offline.txt
        )

        goto :eof

        )

Ответы [ 2 ]

3 голосов
/ 21 февраля 2011

Читать это: Расширение переменной среды происходит при чтении команды .

Существенные пункты:

  • Ваши переменные раскрываются прямо при разборе команды for (и все ее тело заключено в скобки).
  • Используйте !VARNAME! вместо %VARNAME%, чтобы избежать этого.
  • Для лучшей переносимости между версиями / настройками ОС, будет хорошей идеей вставить setlocal EnableExtensions EnableDelayedExpansion в начале вашего пакетного файла.

Кроме того, убедитесь, что после call :next есть goto (например, goto :EOF), поскольку опубликованный код будет проходить через next один дополнительный раз.

0 голосов
/ 21 февраля 2011

Вы можете перейти с setlocal EnableDelayedExpansion и изменить синтаксис % на ! при обращении к переменным внутри цикла, которые инициализируются в этом же цикле, так же, как предложил atzz .

Но есть другой подход. Вы можете просто переместить тело цикла в подпрограмму (другую). Таким образом, переменные будут расширяться, как и ожидалось.

Title Scanning online computers: && set /a title_count=0
call :next
<b><i>::added as possibly missing
GOTO :EOF</i></b>

:next
FOR /F "tokens=1" %%a IN (workstation.txt) DO CALL :pingstation %%a
GOTO :EOF

:pingstation
title Scanning for online computers: %title_count% / %workstation%
ping -n 1 %1 | find "bytes=" >nul
set /a title_count+=1

if NOT ERRORLEVEL 1 (
set color=%1 && call includes\what.bat %color_pass% && echo %1 >> logs\reachable.txt
) else ( 
set color=%1 && call includes\what.bat %color_fail% && echo %1 >> logs\unreachable.txt && echo %1, offline, %date%, %time% >> logs\offline.txt
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...