Se as instruções que causam falhas no arquivo em lote?

0

Estou tendo problemas para usar instruções IF em um arquivo em lotes. Eu tenho que configurar com um set / p, mas quando o código chega à declaração IF fecha. Este arquivo descreve o que quero dizer:

@echo off  
set res1=word  
echo put in word.  
set /p ui=  
if %ui%==%res1% (goto oh)  
echo You put nothing in!  
pause  
:oh  
echo oh.  
pause

Executá-lo e não colocar nada faz com que ele trave, NÃO ecoando o texto e pausando. O que estou fazendo errado?

    
por quark8790 16.05.2013 / 10:28

3 respostas

3

Este é um problema comum em muitas linguagens de script. A questão é que os nomes das variáveis são expandidos para seus valores antes que a linha seja executada. Se a variável for deixada em branco, o script executará o código:

if ==word (goto oh)

Os dois sinais de igual não são analisados como o operador de igualdade porque o IF espera encontrar um item para comparação em ambos os lados. Em vez de (goto , um operador como EQU é esperado e uma mensagem de erro refletirá isso.

Um problema semelhante ocorrerá se o usuário inserir uma string contendo espaços, por exemplo:

if what I typed==word (goto oh)

Esse comportamento pode ser usado para todos os tipos de código sujo. Como exemplo, a condição será avaliada como verdadeira se o usuário inserir 'palavra', mas também se inserir '== palavra EQU', nesse caso a linha será analisada como: if ==word EQU ==word (goto oh) . Geralmente, não queremos lidar com esses casos de borda com muita frequência e podemos evitar o problema com variáveis em branco adicionando caracteres fictícios, por exemplo: if %a%dummy==%b%dummy . Desta forma, a sintaxe será válida mesmo que uma (ou ambas) das variáveis estejam vazias. Nos arquivos em lote, um caractere fictício particularmente útil é o "-symbol, pois também evita que os espaços sejam analisados como delimitadores. O código a seguir deve ser significativamente mais robusto:

if "%ui%"=="%word%" (goto oh)
    
por 16.05.2013 / 12:35
2
If x%ui%x==x%res1%x

Não precisa ser x . É simplesmente um truque para permitir a variante final vazia.

Normalmente, uso "%ui%"=="%res1%" porque parece mais um idioma real.

Eu aprendi isso com ss64.com . Há muito tempo. Ótimo site.

Editar: colchetes é uma opção mais segura, conforme mencionado abaixo.

    
por 16.05.2013 / 11:31
1

A solução de Michael para adicionar aspas duplas pode ser problemática se o valor que você está testando tiver aspas duplas. Uma maneira menos provável de causar problemas seria usar colchetes:

IF [%1]==[/?] ...

De Site de Rob Van der Woude

Se% 1 em si puder conter aspas, você está com problemas: se% 1 for igual a "/?" incluindo as aspas, IF "% 1" == "/?" ... avalia se IF "" /? "" == "/?" ... o que gerará uma mensagem de erro.

    
por 16.01.2014 / 20:35