Por que meu IF ELSE não funciona?

0

É um script simples que eu escrevi, nada extravagante em tudo

@echo off

echo 1 = stream1 source
echo 2 = stream1 high
echo 3 = stream1 medium
echo 4 = stream1 low
echo 5 = stream2 source
echo 6 = stream2 high
echo 7 = stream2 medium
echo 8 = stream2 low

set /p id="Enter ID: "

IF %id% == 1 (
    set link=twitch.tv/stream1 source
) ELSE IF %id% == 2 (
    set link=twitch.tv/stream1 high
) ELSE IF %id% == 3 (
    set link=twitch.tv/stream1 medium
) ELSE IF %id% == 4 (
    set link=twitch.tv/stream1 low
) ELSE IF %id% == 5 (
    set link=twitch.tv/stream2 source
) ELSE IF %id% == 6 (
    set link=twitch.tv/stream2 high
) ELSE IF %id% == 7 (
    set link=twitch.tv/stream2 medium
) ELSE IF %id% == 8 (
    set link=twitch.tv/stream1 high
) ELSE (
echo ..............
echo 1 = source
echo 2 = high
echo 3 = medium
echo 4 = low

set /p quality="Enter ID: "

    IF %quality% == 1 (
        set hq="source"
    ) ELSE IF %quality% == 2 (
        set hq="high"
    ) ELSE IF %quality% == 3 (
        set hq="medium"
    ) ELSE IF %quality% == 4 (
        set hq="low"
    ) ELSE (
        set hq="source"
    )
    set link=twitch.tv/%id% %hq%
)

Start C:\livestreamer\livestreamer.exe %link%

echo %link%

pause

O que ele faz é pedir um número 1-8, se for 1-8, ele executará o programa livestream.exe com a linha de comando stream1 source, stream2 source, etc, dependendo do que o usuário insere.

Se não for 1-8, o programa pede a qualidade, então source / high / medium / low.

Por exemplo, se colocarem 1, o comando que finalmente será executado é

Start C:\livestreamer\livestreamer.exe stream1 source

Se 2,

Start C:\livestreamer\livestreamer.exe stream1 high

etc

Se eles colocarem, por exemplo, asdfasdf

depois coloque em alta, então a final será

Start C:\livestreamer\livestreamer.exe asdfasdf high

Funciona se eu remover o material dentro da condição final else, mas caso contrário não: (

O erro que estou recebendo é

( was unexpected at this time.
    
por Jo Jo 01.08.2015 / 03:43

2 respostas

0

Parece que você precisa alterar suas declarações de% id% == 1 para a forma de "% id%" == "1".

Quando a variável de macro (por exemplo,% id%) é definida como um espaço, ela é expandida para: IF space == 1 ( que não é uma sintaxe válida. Mas se você cercar a variável macro com algum conjunto de caracteres (eu costumo usar aspas duplas) a instrução é expandida para SE " space " == 1 ( que é uma sintaxe válida, mas não está de acordo com suas intenções. Para fazê-lo funcionar você precisa cercar o valor de comparação com o mesmo caractere (nesse caso, aspas duplas).

IF "%id%"=="1"

IF "%id%"=="1" (
    set link=twitch.tv/stream1 source
) ELSE IF "%id%"=="2" (
    set link=twitch.tv/stream1 high
) ELSE IF "%id%"=="3" (
    set link=twitch.tv/stream1 medium
...

    IF "%quality%"=="1" (
        set hq="source"
    ) ELSE IF "%quality%"=="2" (
        set hq="high"
    ...
    
por 01.08.2015 / 06:01
0

A linha que está falhando é a IF %quality% == 1 .

Enquanto o arquivo em lote só executa logicamente o If aninhado em uma ramificação, a instrução If inteira é processada como um comando e, portanto, o comando inteiro deve ser válido em todas as ramificações. Sua declaração If (como um todo) não é válida no momento do processamento.

Se você ativar o Echo, verá a linha falhar como

( was unexpected at this time.
C:\Temp>    IF  == 1 (

Observe a parte que falhou: IF == 1 ( .

Isso é inválido porque não há lado esquerdo para a comparação. Não há lado esquerdo da comparação porque o set para atribuir um valor à variável quality não foi executado antes do processamento do If (já que está aninhado dentro do If).

Uma correção:

Coloque os dois lados de todas as comparações entre aspas, para que um valor vazio seja "" em vez de apenas um espaço.

Por exemplo:

IF "%id%" == "1" (
    set link=twitch.tv/stream1 source
) ELSE IF "%id%" == "2" (
    set link=twitch.tv/stream1 high
) ELSE IF "%id%" == "3" (
    set link=twitch.tv/stream1 medium
) ELSE IF "%id%" == "4" (
    set link=twitch.tv/stream1 low
) ELSE IF "%id%" == "5" (
    set link=twitch.tv/stream2 source
) ELSE IF "%id%" == "6" (
    set link=twitch.tv/stream2 high
) ELSE IF "%id%" == "7" (
    set link=twitch.tv/stream2 medium
) ELSE IF "%id%" == "8" (
    set link=twitch.tv/stream1 high
) ELSE (...

Outra correção:

Mova o If aninhado em sua própria seção rotulada e use as instruções Goto para direcionar o fluxo.

@echo off

echo 1 = stream1 source
echo 2 = stream1 high
echo 3 = stream1 medium
echo 4 = stream1 low
echo 5 = stream2 source
echo 6 = stream2 high
echo 7 = stream2 medium
echo 8 = stream2 low

set /p id="Enter ID: "

IF %id% == 1 (
    set link=twitch.tv/stream1 source
) ELSE IF %id% == 2 (
    set link=twitch.tv/stream1 high
) ELSE IF %id% == 3 (
    set link=twitch.tv/stream1 medium
) ELSE IF %id% == 4 (
    set link=twitch.tv/stream1 low
) ELSE IF %id% == 5 (
    set link=twitch.tv/stream2 source
) ELSE IF %id% == 6 (
    set link=twitch.tv/stream2 high
) ELSE IF %id% == 7 (
    set link=twitch.tv/stream2 medium
) ELSE IF %id% == 8 (
    set link=twitch.tv/stream1 high
) ELSE (
    goto ChooseQuality
)

goto StartProgram


:ChooseQuality

echo ..............
echo 1 = source
echo 2 = high
echo 3 = medium
echo 4 = low

set /p quality="Enter ID: "

IF %quality% == 1 (
    set hq="source"
) ELSE IF %quality% == 2 (
    set hq="high"
) ELSE IF %quality% == 3 (
    set hq="medium"
) ELSE IF %quality% == 4 (
    set hq="low"
) ELSE (
    set hq="source"
)
set link=twitch.tv/%id% %hq%

goto StartProgram


:StartProgram

Start C:\livestreamer\livestreamer.exe %link%

echo %link%

pause
    
por 01.08.2015 / 06:18