Check if label exists cmd

前端 未结 5 849
深忆病人
深忆病人 2021-01-03 06:29

I wonder is there any way to check that if a label exist in a batch file?

If %input%=ABC (  
  If Label ABC Exists (
    Goto ABC
  )
)

How

5条回答
  •  天涯浪人
    2021-01-03 07:01

    findstr /i /r /c:"^[ ]*:%input%\>" "%~f0" >nul 2>nul && goto %input%
    

    Search the label in the current batch file and if no errorlevel, label exists

    EDITED - I realized there was an error on the way i was handling the end of the label and was going to edit the answer (it has been edited anyway) and i see the dbenham aclarations. He saw the error and corrected it. Thank you. Nice answer as always, BUT this is worse than what you have exposed.

    In this moment i have only a XP to test, but this is what works for me. If anyone can test on later windows versions, please.

    First problem: the start of the label. As usual dbenham is correct, and any character in the set [;=,0xFF] can precede, single or repeated, the colon of the label. But, as far as it is the first character on the line, and it does not repeat, almost any character can precede the colon of the label (one exception is other colon). So, the following will work without problems

        call :test
        goto :test
        echo this will not be echoed
    
    X=;=:test
        echo Hello
    

    NO, this it not a valid line, if the parser try to execute the label line, a "command not recognized" error will happen, BUT is a valid label to call or goto.

    Second problem: end of the label. As dbenham identified, most of us place a space and the list of arguments when the label is used to define a function/procedure. This was the error i realized and what has been corrected in my original answer. BUT, a space (and obviously the end of line) is not the only allowed characters after the label name. So, In the previous sample, any of the following labels will work

    :test arguments
    :test:arguments
    :test>arguments
    :test

    And yes,in this case they are valid commands to the parser and are valid labels

    AND, of course, the two "problems" can happen at the same time

        call :test
        goto :test
        echo this will not be echoed
    
    < ;;:test:;; > This WORKS 
        echo Hello
    

    POST EDIT 1 - It seems all this work was done years ago at dostips.com. Thanks to all who compiled the exaustive list referenced in comments. Next time, i'll search first.

    POST EDIT 2 - I've been trying to deal with the limitations of findstr to include all cases. Well, there is no way. There are too many limitations, starting with the impossibility of include the 0xff character in a regular expression.

    For a robust and simple solution, the answer from dbenham is the best option.

    For a more robust, but STILL INCOMPLETE, no bulletproof version, and more complex than dbenham's answer

    @echo off
    
        for /l %%i in (1 1 10) do (
            call :testLabelExist "test%%i" && echo Label [test%%i] exist || echo Label [test%%i] does not exist
        )
        exit /b
    
    :test1
     :test2
        :test3
    x:test4
    ::test5
    :test6:
    :test7#
     :test8 parameters
        :test9 parameters
    :test10:myData
    
    
    :testLabelExist
        for /f "delims=" %%t in (
            'forfiles /p "%~dp0." /m "%~nx0" /c "cmd /d /c @echo 0x09"'
        ) do (
            findstr /i /m /r /c:"^[^:]*[ %%t]*:%~1[ %%t:;,=+]" /c:"^[^:]*[ %%t]*:%~1$" "%~f0" >nul 2>nul 
        )
        exit /b %errorlevel%
    

    And it still leaves out quoted label names, just to name one failure point.

提交回复
热议问题