Underbytex
Underbytex

Reputation: 429

Batch - If, ElseIf, Else

Whats wrong with this code?

IF "%language%" == "de" (
    goto languageDE
) ELSE (
    IF "%language%" == "en" (
    goto languageEN
) ELSE (
    echo Not found.
)

I'm not really good in Batch..

Upvotes: 40

Views: 291628

Answers (6)

CristiFati
CristiFati

Reputation: 41116

As @cHao commented, the opening parentheses number is higher (+1) than the closing ones'. The 2 need to be equal (to be more precise, the "(" just after the 1st ELSE should not be there).

Check [MS.Learn]: if (or help if, personally I prefer [SS64]: IF) for more details.

Because of the fact that each branch only contains a [SS64]: GOTO, the whole block could be rewritten as 2 independent If commands (simpler), but this is a generic form and other commands could be added in each branch (yes, Batch does allow (some degree of) structuring).

script00.bat:

@echo off


if "%LANGUAGE%" == "de" (
    goto :languageDE
) else if "%LANGUAGE%" == "en" (
    goto :languageEN
) else (
    echo Not found.
)


goto :eof


:languageDE
    echo Deutsche.
    goto :eof


:languageEn
    echo English.
    goto :eof

Output:

[cfati@CFATI-5510-0:e:\Work\Dev\StackExchange\StackOverflow\q025384358]> sopr.bat
### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ###

[prompt]> dir /b
script00.bat

[prompt]>
[prompt]> for %g in (dummy de ro en x) do (set LANGUAGE=%g& script00.bat)

[prompt]> (set LANGUAGE=dummy  & script00.bat)
Not found.

[prompt]> (set LANGUAGE=de  & script00.bat)
Deutsche.

[prompt]> (set LANGUAGE=ro  & script00.bat)
Not found.

[prompt]> (set LANGUAGE=en  & script00.bat)
English.

[prompt]> (set LANGUAGE=x  & script00.bat)
Not found.

Upvotes: 4

npocmaka
npocmaka

Reputation: 57252

@echo off

set "language=de"

IF "%language%" == "de" (
    goto languageDE
) ELSE (
    IF "%language%" == "en" (
        goto languageEN
    ) ELSE (
        echo Not found.
    )
)

:languageEN
:languageDE

echo %language%

This works , but not sure how your language variable is defined.Does it have spaces in its definition.

Upvotes: 29

Magoo
Magoo

Reputation: 80023

@echo off
title Test

echo Select a language. (de/en)
set /p language=

IF /i "%language%"=="de" goto languageDE
IF /i "%language%"=="en" goto languageEN

echo Not found.
goto commonexit

:languageDE
echo German
goto commonexit

:languageEN
echo English
goto commonexit

:commonexit
pause

The point is that batch simply continues through instructions, line by line until it reaches a goto, exit or end-of-file. It has no concept of sections to control flow.

Hence, entering de would jump to :languagede then simply continue executing instructions until the file ends, showing de then en then not found.

Upvotes: 61

@echo off
color 0a
set /p language=
if %language% == DE (
    goto LGDE
) else (
    if %language% == EN (
    goto LGEN
    ) else (
    echo N/A
)

:LGDE
(code)
:LGEN
(code)

Upvotes: 0

WaitForPete
WaitForPete

Reputation: 467

Recommendation. Do not use user-added REM statements to block batch steps. Use conditional GOTO instead. That way you can predefine and test the steps and options. The users also get much simpler changes and better confidence.

@Echo on
rem Using flags to control command execution

SET ExecuteSection1=0
SET ExecuteSection2=1

@echo off

IF %ExecuteSection1%==0 GOTO EndSection1
ECHO Section 1 Here

:EndSection1

IF %ExecuteSection2%==0 GOTO EndSection2
ECHO Section 2 Here
:EndSection2

Upvotes: 1

ths
ths

Reputation: 2942

batchfiles perform simple string substitution with variables. so, a simple

goto :language%language%
echo notfound
...

does this without any need for if.

Upvotes: 12

Related Questions