La réponse courte - utilisez des crochets:
if [%1]==[] goto :blank
ou (lorsque vous avez besoin de gérer des arguments entre guillemets, consultez la modification ci-dessous):
if [%~1]==[] goto :blank
Pourquoi? vous pourriez demander. Eh bien, tout comme Jeremiah Willcock l'a mentionné: http://ss64.com/nt/if.html - ils l'utilisent! OK, mais quel est le problème avec les citations?
Encore une fois, réponse courte: ils sont "magiques" - parfois les guillemets doubles (doubles) sont convertis en guillemets simples (doubles). Et ils doivent correspondre, pour commencer.
Considérez ce petit script:
@rem argq.bat
@echo off
:loop
if "%1"=="" goto :done
echo %1
shift
goto :loop
:done
echo Done.
Testons-le:
C:\> argq bla bla
bla
bla
Done.
Semble fonctionner. Mais maintenant, passons à la deuxième vitesse:
C:\> argq "bla bla"
bla""=="" was unexpected at this time.
Boom Cela n'a pas évalué à vrai, ni à faux. Le script est mort. Si vous étiez censé éteindre le réacteur quelque part sur la ligne, eh bien - pas de chance. Vous allez maintenant mourir comme Harry Daghlian.
Vous pensez peut-être - OK, les arguments ne peuvent pas contenir de guillemets. S'ils le font, cela se produit. Faux Voici une consolation:
C:\> argq ""bla bla""
""bla
bla""
Done.
Oh oui. Ne vous inquiétez pas - parfois cela va fonctionner.
Essayons un autre script:
@rem args.bat
@echo off
:loop
if [%1]==[] goto :done
echo %1
shift
goto :loop
:done
echo Done.
Vous pouvez vous tester, que cela fonctionne bien pour les cas ci-dessus. C'est logique - les guillemets n'ont rien à voir avec les crochets, il n'y a donc pas de magie ici. Mais qu'en est-il de pimenter les arguments avec des crochets?
D:\>args ]bla bla[
]bla
bla[
Done.
D:\>args [bla bla]
[bla
bla]
Done.
Pas de chance là-bas. Les parenthèses ne peuvent tout simplement pas étouffer cmd.exe
l'analyseur.
Revenons un instant aux mauvaises citations. Le problème était là, lorsque l'argument s'est terminé par une citation:
D:\>argq "bla1 bla2"
bla2""=="" was unexpected at this time.
Et si je passe juste:
D:\>argq bla2"
The syntax of the command is incorrect.
Le script ne fonctionnera pas du tout. Idem pour args.bat
:
D:\>args bla2"
The syntax of the command is incorrect.
Mais qu'est-ce que j'obtiens, lorsque le nombre de "
caractères "correspond" (c'est-à-dire - est pair), dans un tel cas:
D:\>args bla2" "bla3
bla2" "bla3
Done.
NICE - J'espère que vous avez appris quelque chose sur la façon dont les .bat
fichiers divisent leurs arguments de ligne de commande (ASTUCE: * Ce n'est pas exactement comme dans bash). L'argument ci-dessus contient un espace. Mais les citations ne sont pas supprimées automatiquement.
Et argq? Comment réagit-il à cela? De manière prévisible:
D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.
Alors - réfléchissez avant de dire: "Tu sais quoi? Utilise juste des guillemets. [Parce que, pour moi, ça a l'air plus joli]".
Éditer
Récemment, il y a eu des commentaires sur cette réponse - eh bien, les crochets "ne peuvent pas gérer" en passant des arguments cités et en les traitant comme s'ils n'étaient pas cités.
La syntaxe:
if "%~1"=="" (...)
N'est-ce pas une vertu nouvellement trouvée des guillemets doubles, mais un affichage d'une fonctionnalité intéressante de suppression des guillemets de la variable d'argument, si le premier et le dernier caractère sont des guillemets doubles.
Cette "technologie" fonctionne aussi bien avec les crochets:
if [%~1]==[] (...)
C'était une chose utile de le souligner, alors je suis également favorable à la nouvelle réponse.
Enfin, fans des guillemets doubles, un argument de forme ""
existe-t-il dans votre livre ou est-il vide? Je demandais juste' ;)
GOTO BLANK
ligne) aux deux autresIF
instructions, est-ce que cela résout le problème?