командный файл windows с командой goto не работает - PullRequest
4 голосов
/ 20 октября 2010

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

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

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

Сценарий:

@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

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

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

1 Ответ

12 голосов
/ 24 октября 2010

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

Одна проблема заключается в том, что 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 ::
...