У вас две проблемы.
Одна проблема заключается в том, что goto прерывает цикл for.
С другой стороны, метки в скобках довольно сложны.
Goto разрывает всегда и все вложенные циклы, даже если метка goto находится в одном и том же блоке, а переменные for теряются сразу после перехода.
В скобках метки ориентированы на две строки!
Я экспериментировал с метками, и вот некоторые результаты для скобок.
Когда появляется метка, следующая строка должна быть в правильном формате для «вторичной» строки.
Вот почему это не удается.
(
:this label fails with a syntax error
)
(
:this works
:because this line is a "legal" secondary line
)
(
:: The remark style
:: fails, because it's not "legal" to use a double colon, because it's not a legal path (in the most cases)
)
(
:and now I got courious & echo This will not echo'd
:but & echo You can see this !
)
Для второй строки некоторые шаги пакетного парсера пропускаются.
@
не работает, @echo Hello
пытается запустить файл с именем @echo.bat
.
Ошибка разбиения скобок, как в echo( hello
.
Метки обрабатываются как имя файла, :echo
проверяет, только если :echo
является допустимым именем файла, а затем пропускает эту часть.
::hello
поиск на диске ::
.
В целях тестирования привод ::
может быть создан с помощью subst :: c:\temp
.
.
Поскольку метки во второй строке просто игнорируются, амперсанды, а также каналы работают, но файл в ::
должен существовать.
(
echo @echo This is %~f0
) > %TEMP%\testLabel.bat
REM create Drive ::
subst :: %temp%
(
:Label
::\testLabel.bat The bat will not be executed | echo But this
)
subst /D ::