Оконный командный файл с командой goto не работает

У меня проблема с командой GOTO и аффилированными ярлыками.

Факты: Учитывая кучу файлов из папки (это ошибки журнала), мне нужно открыть их и проверить, содержит ли они определенную строку. Если да, то удалите некоторые символы (все символы после последнего появления "_", включая себя) из имен файлов и выполняйте другие операции.

Для отсечения символов я использую команду GOTO в цикле, как я нашел здесь: http://www.robvanderwoude.com/battech_while_loops.php

script:

@echo off
setlocal EnableDelayedExpansion

cls

for %%X in (D:\e-pub\outbox\logs\*.*) do (

    for /F "tokens=7" %%S in (%%X) do (

        if /i "%%S"=="<ml>" (
            SET fisier=%%~nX
            SET cond=!fisier:~-1!
            SET fisier=!fisier:~0,-1!

            :loopStart
            rem condition to break the loop
            if !cond!==_ goto loopEnd
            SET cond=!fisier:~-1!
            SET fisier=!fisier:~0,-1!
            goto loopStart

            :loopEnd

            rem here it should be out of a loop
            rem other stuff to do with var !fisier!
            rem the following line is not executed because of the label loopEnd
            echo !fisier!
        )
    )
) 

pause

script не запущен, потому что после метки labelEnd есть пустая строка?! Если я пишу какие-либо инструкции сразу после этого ярлыка, они будут выполнены, но остальные итерации из первого для оператора не будут выполнены (папка с ошибками журнала содержит более одного файла)

Может ли кто-нибудь помочь?

Ответ 1

У вас две проблемы.

Одна проблема заключается в том, что 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 not "legal" to use a double colon, because it 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 ::