A resposta curta - use colchetes:
if [%1]==[] goto :blank
ou (quando você precisar lidar com argumentos citados, consulte a edição abaixo):
if [%~1]==[] goto :blank
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:
@rem argq.bat
@echo off
:loop
if "%1"=="" goto :done
echo %1
shift
goto :loop
:done
echo Done.
Vamos testar:
C:\> argq bla bla
bla
bla
Done.
Parece funcionar. Mas agora, vamos mudar para a segunda marcha:
C:\> argq "bla bla"
bla""=="" was unexpected at this time.
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:
C:\> argq ""bla bla""
""bla
bla""
Done.
Oh sim. Não se preocupe - às vezes isso vai funcionar.
Vamos tentar outro script:
@rem args.bat
@echo off
:loop
if [%1]==[] goto :done
echo %1
shift
goto :loop
:done
echo Done.
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?
D:\>args ]bla bla[
]bla
bla[
Done.
D:\>args [bla bla]
[bla
bla]
Done.
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:
D:\>argq "bla1 bla2"
bla2""=="" was unexpected at this time.
E se eu passar apenas:
D:\>argq bla2"
The syntax of the command is incorrect.
O script não será executado. O mesmo para args.bat
:
D:\>args bla2"
The syntax of the command is incorrect.
Mas o que eu obtenho, quando o número de "
-caracteres "corresponde" (ou seja, - é par), em tal caso:
D:\>args bla2" "bla3
bla2" "bla3
Done.
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:
D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.
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:
if "%~1"=="" (...)
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:
if [%~1]==[] (...)
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' ;)
GOTO BLANK
linha) às outras duasIF
declarações, isso resolve o problema?