Em um arquivo de lote DOS, só podemos ter 1 linha se o corpo da instrução? Acho que encontrei algum lugar que poderia usar ()
para um bloco if, exatamente como o {}
usado em linguagens de programação como C, mas não está executando as instruções quando tento fazer isso. Nenhuma mensagem de erro também. Este meu código:
if %GPMANAGER_FOUND%==true(echo GP Manager is up
goto Continue7
)
echo GP Manager is down
:Continue7
Estranhamente, nem "GP Manager is up" nem "GP Manager is down" são impressos quando executo o arquivo em lote.
if-statement
batch-file
Hugh Darling
fonte
fonte
Respostas:
Você pode, de fato, criar um bloco de instruções para executar após uma condicional. Mas você tem a sintaxe errada. Os parênteses devem ser usados exatamente como mostrado:
No entanto, não acredito que haja qualquer sintaxe embutida para
else-if
instruções. Infelizmente, você precisará criar blocos aninhados deif
instruções para lidar com isso.Em segundo lugar, esse
%GPMANAGER_FOUND% == true
teste parece muito suspeito para mim. Não sei como a variável de ambiente está definida ou como você está definindo, mas duvido muito que o código que você mostrou produzirá o resultado que você está procurando.O código de exemplo a seguir funciona bem para mim:
Observe alguns detalhes específicos sobre meu código de amostra:
@echo off
para não ver todas as instruções impressas no console à medida que são executadas e, em vez disso, ver apenas a saída daquelas que especificamente começam comecho
.ERRORLEVEL
variável interna apenas como um teste. Leia mais aquifonte
ERRORLEVEL
não é a resposta para seu problema. Eu estava simplesmente postando um exemplo da sintaxe adequada. Qualquer forma é aceitável neste caso, assim como seriaif 0 == 0
ou qualquer outra expressão trivial. Mas, na verdade, certifique-se de entender a diferença entre a variável de ambiente%ERRORLEVEL%
e a internaERRORLEVEL
do processador de comando. Raymond Chen explica isso muito bem aqui neste blog .REM This is a comment (or so I thought)
noIF
bloco vai bagunçar você.IF %somevar%==example_string2
, deve ser sempre código para que o operando resolvaIF "value_of_somevar"=="example_string2
"para evitar que caracteres especiais em qualquer operando de string causem erros de sintaxe naIF
instrução. Os valores que você definir devem ser sempre executados comoset "somevar=value_of_somevar"
Essa sintaxe permite que você escape caracteres especiais em valores variáveis, Nota que eu não quero dizerset somevar="value_of_somevar"
Logicamente, a resposta de Cody deve funcionar. No entanto, não acho que o prompt de comando lida com um bloco de código logicamente. Pela minha vida, não consigo fazer isso funcionar corretamente com mais do que um único comando dentro do bloco. No meu caso, testes extensivos revelaram que todos os comandos dentro do bloco estão sendo armazenados em cache e executados simultaneamente no final do bloco. É claro que isso não produz os resultados esperados. Aqui está um exemplo simplificado:
Isso deve fornecer var3 com o seguinte valor:
mas, em vez disso, produz:
porque todos os 3 comandos são armazenados em cache e executados simultaneamente ao sair do bloco de código.
Consegui superar esse problema reescrevendo o bloco if para executar apenas um comando - goto - e adicionando alguns rótulos. É desajeitado e não gosto muito disso, mas pelo menos funciona.
fonte
set var3=!var1!_!var2!
Em vez dessa bagunça goto, tente usar o "e" comercial & ou o "e" comercial duplo && (condicional ao nível de erro 0) como separadores de comando.
Corrigi um trecho de script com este truque, para resumir, tenho três arquivos em lote, um que chama os outros dois depois de ter encontrado as letras que as unidades de backup externas foram atribuídas. Deixo o primeiro arquivo na unidade externa primária para que as chamadas para sua rotina de backup funcionem bem, mas as chamadas para o segundo exigem uma mudança de unidade ativa. O código abaixo mostra como corrigi-lo:
fonte
Eu encontrei este artigo nos resultados retornados por uma pesquisa relacionada ao comando IF em um arquivo em lote e não pude resistir à oportunidade de corrigir o equívoco de que os blocos IF são limitados a comandos únicos. A seguir está uma parte de um script de comando de produção do Windows NT que é executado diariamente na máquina na qual estou redigindo esta resposta.
Talvez os blocos de duas ou mais linhas se apliquem exclusivamente aos scripts de comando do Windows NT (arquivos .CMD), porque uma pesquisa no diretório de scripts de produção de um aplicativo restrito a arquivos batch da velha escola (.BAT) revelou apenas blocos de um comando . Como o aplicativo entrou em manutenção estendida (o que significa que não estou ativamente envolvido no suporte), não posso dizer se é porque não precisei de mais de uma linha ou não consegui fazê-los funcionar.
Independentemente disso, se o último for verdadeiro, há uma solução simples; mova as várias linhas para um arquivo em lote separado ou uma sub-rotina de arquivo em lote. Eu sei que este último funciona em ambos os tipos de scripts.
fonte
Talvez um pouco tarde, mas espero que demônios:
fonte