Пакетный скрипт, не обрабатывающий оставшийся файл после шага goto

-8

У меня есть командный файл, который записывает в текстовый файл записи. Каждая из этих записей должна быть обработана из файла. Например, если Name == KD переходите к шагу 1, продолжайте следующие шаги.

Проблема после перехода к этапу 1 завершает файл. Мне нужно вернуться к следующей записи, чтобы продолжить обработку с помощью DF. Я добавил ярлык в раздел, чтобы вернуться, но он продолжает обрабатывать только запись KD.

Пример текстового файла:

Line Name Container
1 KD 123
2 DF 657

Код:

set txtfilepath=C:\Temp\Test.txt
set /a cnt=0
for /f %%a in ('type "%txtfilepath%"^|find "" /v /c') do set /a cnt=%%a
echo %txtfilepath% has %cnt% lines

for /f "skip=1 tokens=1,2,3,4,5* delims=,] " %%a in ('find /v /n "" ^< %txtfilepath%') do (

echo.%%b - this displays variable fine.
if %%b==DF (
set result=true
) else (
goto donotexecute
)
echo I am in true loop.

:donotexecute
echo i am in do not import loop

)
:Done

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

спросил(а) 2021-01-25T18:36:31+03:00 4 месяца, 4 недели назад
1
Решение
63

Во-первых, не используйте set/a (оценивать арифметическое выражение), если вы просто хотите присвоить значение переменной среды.

Переменные среды всегда имеют строку типа. При арифметическом выражении каждое число, указанное непосредственно или удерживаемое переменной окружения, временно преобразуется в 32-разрядное целое число со знаком для оценки выражения, а целочисленный результат, наконец, преобразуется обратно в строку, хранящуюся в указанной переменной среды. Намного быстрее назначает числовую строку непосредственно переменной среды.

Во-вторых, командный процессор Windows не поддерживает метки в цикле FOR. Вам нужно использовать подпрограммы.

@echo off
set "txtfilepath=C:\Temp\Test.txt"

rem Don't know why the number of lines in the files must be determined first?
set "cnt=0"
for /F %%a in ('type "%txtfilepath%" ^| %SystemRoot%\System32\find.exe "" /v /c') do set "cnt=%%a"
echo %txtfilepath% has %cnt% lines.

for /F "usebackq skip=1 tokens=1-5* delims=,] " %%a in ("%txtfilepath%") do (
if "%%b" == "DF" (
call :ProcessDF "%%c"
) else if "%%b" == "KD" (
call :ProcessKD "%%c"
)
)

echo Result is: %result%

rem Exit processing of this batch file. This command is required because
rem otherwise the batch processing would continue unwanted on subroutine.
goto :EOF

rem This is the subroutine for name DF.

:ProcessDF
echo Processing DF ...
set "result=true"
echo Container is: %~1
goto :EOF

rem The command above exits subroutine and batch processing continues
rem on next line below the command line which called this subroutine.

rem This is the subroutine for name KD.

:ProcessKD
echo Processing KD ...
echo Container is: %~1
rem Other commands to process.
goto :EOF

Чтобы понять используемые команды и как они работают, откройте окно командной строки, выполните там следующие команды и тщательно прочитайте все страницы справки, отображаемые для каждой команды.

    call/? echo/? find/? for/? goto/? if/? rem/? set/? type/?

exit/B можно было использовать везде, где goto :EOF используется, поскольку это точно то же самое. Запустить в окне командной строки exit/? для деталей. Иногда в больших пакетных файлах имеет смысл использовать, например, exit/B где используется для выхода из обработки командного файла и goto :EOF где используется только для выхода из подпрограммы.

ответил(а) 2021-01-25T18:36:31+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема