Meu sistema operacional é o Windows Vista. Eu preciso ter um arquivo ".bat" onde preciso verificar se o usuário insere algum parâmetro de linha de comando ou não. Se sim, então se o parâmetro for igual a -b
então farei algo, caso contrário, sinalizarei "Entrada inválida". Se o usuário não inserir nenhum parâmetro de linha de comando, farei algo. Eu criei o seguinte arquivo .bat. Ele funciona para os casos -b
e não é igual a eles -b
- mas falha quando o usuário não passa nenhum parâmetro de linha de comando.
Sempre recebo erros:
GOTO was unexpected at this time.
Alguém pode me dizer o que estou fazendo de errado aqui?
ECHO OFF
CLS
ECHO.
IF [%1]==[/?] GOTO BLANK
IF %1=="-b" GOTO SPECIFIC
IF NOT %1=="-b" GOTO UNKNOWN
:SPECIFIC
ECHO SPECIFIC
GOTO DONE
:BLANK
ECHO No Parameter
GOTO DONE
:UNKNOWN
ECHO Unknown Option
GOTO DONE
:DONE
ECHO Done!
windows
file
batch-file
cmd
javauser71
fonte
fonte
GOTO BLANK
linha) às outras duasIF
declarações, isso resolve o problema?Respostas:
Você precisa verificar se o parâmetro está em branco:
if "%~1"=="" goto blank
Depois de fazer isso, faça um if / else alterne para -b:
if "%~1"=="-b" (goto specific) else goto unknown
Colocar os parâmetros entre aspas facilita a verificação de itens como parâmetros em branco / vazios / ausentes. "~" garante que as aspas duplas sejam removidas se estiverem no argumento da linha de comando.
fonte
File
, nesse caso você deve verificar apenasexist
ounot exist
. É por isso que seus argumentos devem ser bem definidos ou simplesmente usar powershell ou vbScript (se você estiver nos anos 80 ..)run.bat "a b"
."%1"==""
falha se o arg tiver um espaço. Consulte stackoverflow.com/a/46942471Consulte http://ss64.com/nt/if.html para obter uma resposta; o comando é
IF [%1]==[] GOTO NO_ARGUMENT
ou semelhante.fonte
"%1"==""
. Eu tenho que elaborar sobre isso em minha própria resposta.foo.bat "1st parameter" 2nd_param
. Consulte stackoverflow.com/questions/2541767/…[%1]==[-b]
não corresponderá se arg estiver entre aspas. Exemplorun.bat "-b"
. Consulte stackoverflow.com/a/46942471A resposta curta - use colchetes:
ou (quando você precisar lidar com argumentos citados, consulte a edição abaixo):
Por quê? você pode perguntar. Bem, assim como Jeremiah Willcock mencionou: http://ss64.com/nt/if.html - eles usam isso! OK, mas o que há de errado com as aspas?
Novamente, uma resposta curta: eles são "mágicos" - às vezes as aspas duplas são convertidas em aspas simples (duplas). E eles precisam combinar, para começar.
Considere este pequeno script:
Vamos testar:
Parece funcionar. Mas agora, vamos mudar para a segunda marcha:
Boom Isso não foi avaliado como verdadeiro, nem foi avaliado como falso. O script MORREU. Se você deveria desligar o reator em algum ponto da linha, bem - azar. Você agora vai morrer como Harry Daghlian.
Você pode pensar - OK, os argumentos não podem conter aspas. Se o fizerem, isso acontece. Errado Aqui está um consolo:
Oh sim. Não se preocupe - às vezes isso vai funcionar.
Vamos tentar outro script:
Você pode testar a si mesmo, se funciona bem para os casos acima. Isso é lógico - as aspas não têm nada a ver com colchetes, então não há mágica aqui. Mas e quanto a apimentar os argumentos com colchetes?
Sem sorte aí. Os colchetes simplesmente não podem sufocar
cmd.exe
o analisador.Vamos voltar às citações malignas por um momento. O problema estava lá, quando a discussão terminou com uma citação:
E se eu passar apenas:
O script não será executado. O mesmo para
args.bat
:Mas o que eu obtenho, quando o número de
"
-caracteres "corresponde" (ou seja, - é par), em tal caso:NICE - Espero que você tenha aprendido algo sobre como os
.bat
arquivos dividem seus argumentos de linha de comando (DICA: * Não é exatamente como no bash). O argumento acima contém um espaço. Mas as aspas não são retiradas automaticamente.E argq? Como isso reage a isso? Previsivelmente:
Então - pense antes de dizer: "Sabe o quê? Basta usar aspas. [Porque, para mim, isso parece melhor]".
Editar
Recentemente, houve comentários sobre essa resposta - bem, os colchetes "não conseguem lidar" com a passagem de argumentos citados e tratando-os como se não estivessem citados.
A sintaxe:
Não é uma virtude recém-descoberta das aspas duplas, mas uma exibição de uma característica interessante de retirar aspas da variável de argumento, se o primeiro e o último caractere forem aspas duplas.
Essa "tecnologia" funciona tão bem com colchetes:
Foi útil apontar isso, então também votei positivamente na nova resposta.
Finalmente, fãs de aspas duplas,
""
existe um argumento da forma em seu livro ou está em branco? Apenas perguntando' ;)fonte
[%1]==[-b]
não corresponderão se arg estiver entre aspasrun.bat "-b"
. Consulte stackoverflow.com/a/46942471[%1]==[-b]
e"%1"=="-b"
eram os mesmos para os scripts em lote dos sistemas Win 98 e MS / PC-DOS anteriores. Desde que o win 2000 / NT introduziu a sintaxeif "%~1"=="-b"
onde as aspas duplas têm um significado especial, essa é a maneira como você deve codificar scripts, pois fornece uma proteção mais robusta. As aspas duplas escapam ao significado dos caracteres especiais (tente & | e% chars em sua linha de comando). 99,9% dos exemplos funcionam com sintaxe de aspas duplas - seu exemploargq bla2" "bla3
é apenas um caso para justificar colchetes. Aspas duplas incorporadas são uma receita para o desastre - basta dizercmd
shell. Em outros sistemas, às vezes você pode citar tudo, incluindo o caractere NUL. ( stackoverflow.com/questions/2730732/… ) - esta questão apenas mostra, você precisa usar algum programa externo.Além das outras respostas, que assino, você pode considerar o uso da
/I
opção deIF
comando.pode ser útil se você quiser dar flexibilidade não sensível a maiúsculas e minúsculas aos seus usuários para especificar os parâmetros.
fonte
Você está comparando strings. Se um argumento for omitido,
%1
expande para um espaço em branco para que os comandos se tornem,IF =="-b" GOTO SPECIFIC
por exemplo (o que é um erro de sintaxe). Coloque suas strings entre aspas (ou colchetes).fonte
Na verdade, todas as outras respostas têm falhas. A maneira mais confiável é:
Explicação detalhada:
O uso
"%1"=="-b"
irá travar se passar argumentos com espaços e aspas. Este é o método menos confiável.Usar
[%1]==[-b]
é melhor porque não travará com espaços e aspas, mas não corresponderá se o argumento estiver entre aspas.Usar
"%~1"=="-b"
é o mais confiável.%~1
removerá as aspas se elas existirem. Portanto, ele funciona com e sem aspas e também sem argumentos.fonte
IF [%~1]==[]
- isso funciona, e até controla"-b"
. Você só precisa ser capaz de pensar dentro da caixa, erm, quadrado [colchetes].Tenho lutado recentemente com a implementação de opções de parâmetro complexas em um arquivo em lote, então aqui está o resultado de minha pesquisa. Nenhuma das respostas fornecidas é totalmente segura, exemplos:
"%1"=="-?"
não corresponderá se o parâmetro estiver entre aspas (necessário para nomes de arquivos etc.) ou travará se o parâmetro estiver entre aspas e tiver espaços (novamente, frequentemente visto em nomes de arquivo)Qualquer combinação com colchetes
[%1]==[-?]
ou[%~1]==[-?]
falhará caso o parâmetro tenha espaços entre aspas:A solução mais segura proposta
"%~1"=="-?"
irá travar com um parâmetro complexo que inclui texto fora das aspas e texto com espaços entre aspas:A única maneira de garantir que todos os cenários acima sejam cobertos é usar EnableDelayedExpansion e passar os parâmetros por referência (não por valor) usando variáveis. Então, mesmo o cenário mais complexo funcionará bem:
fonte
O lote do Windows possui a palavra-chave DEFINED para fazer isso.
fonte