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.exeo 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 .batarquivos 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 BLANKlinha) às outras duasIFdeclarações, isso resolve o problema?