Mon système d'exploitation est Windows Vista. J'ai besoin d'un fichier ".bat" où je dois vérifier si l'utilisateur entre un paramètre de ligne de commande ou non. Si c'est le cas, si le paramètre est égal à -b
alors je ferai quelque chose, sinon je marquerai "Entrée invalide". Si l'utilisateur n'entre aucun paramètre de ligne de commande, je ferai quelque chose. J'ai créé le fichier .bat suivant. Cela fonctionne pour -b
et n'est pas égal aux -b
cas - mais il échoue lorsque l'utilisateur ne passe aucun paramètre de ligne de commande.
J'obtiens toujours une erreur:
GOTO was unexpected at this time.
Quelqu'un peut-il me dire ce que je fais de mal ici?
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
la source
la source
GOTO BLANK
ligne) aux deux autresIF
instructions, est-ce que cela résout le problème?Réponses:
Vous devez vérifier que le paramètre est vide:
if "%~1"=="" goto blank
Une fois que vous avez fait cela, faites un commutateur if / else sur -b:
if "%~1"=="-b" (goto specific) else goto unknown
Entourer les paramètres de guillemets, il est plus facile de vérifier des éléments tels que des paramètres vides / vides / manquants. "~" garantit que les guillemets doubles sont supprimés s'ils étaient sur l'argument de ligne de commande.
la source
File
, dans ce cas, vous devriez vérifier uniquementexist
ounot exist
. C'est pourquoi vos arguments doivent être bien définis, ou simplement utiliser PowerShell ou vbScript (si vous êtes dans les années 80 ..)run.bat "a b"
."%1"==""
plante si l'argument a un espace. Voir stackoverflow.com/a/46942471Regardez http://ss64.com/nt/if.html pour une réponse; la commande est
IF [%1]==[] GOTO NO_ARGUMENT
ou similaire.la source
"%1"==""
. Je dois développer cela dans ma propre réponse.foo.bat "1st parameter" 2nd_param
. Voir stackoverflow.com/questions/2541767/…[%1]==[-b]
ne correspondra pas si arg est cité. Exemplerun.bat "-b"
. Voir stackoverflow.com/a/46942471La réponse courte - utilisez des crochets:
ou (lorsque vous avez besoin de gérer des arguments entre guillemets, consultez la modification ci-dessous):
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:
Testons-le:
Semble fonctionner. Mais maintenant, passons à la deuxième vitesse:
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:
Oh oui. Ne vous inquiétez pas - parfois cela va fonctionner.
Essayons un autre script:
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?
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:
Et si je passe juste:
Le script ne fonctionnera pas du tout. Idem pour
args.bat
:Mais qu'est-ce que j'obtiens, lorsque le nombre de
"
caractères "correspond" (c'est-à-dire - est pair), dans un tel cas: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:
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:
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:
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' ;)la source
[%1]==[-b]
ne correspondent pas si arg est cité commerun.bat "-b"
. Voir stackoverflow.com/a/46942471[%1]==[-b]
et"%1"=="-b"
étaient les mêmes pour win 98 et les scripts batch des systèmes MS / PC-DOS antérieurs. Depuis que win 2000 / NT a introduit une syntaxeif "%~1"=="-b"
où les guillemets doubles ont une signification spéciale, c'est ainsi que vous devez coder les scripts car elle offre une protection plus robuste. Les guillemets doubles échappent à la signification des caractères spéciaux (essayez & | et% chars dans votre ligne de commande). 99,9% des exemples fonctionnent avec la syntaxe des guillemets doubles - votre exempleargq bla2" "bla3
n'est que la casse pour justifier les crochets. Les guillemets doubles intégrés sont une recette pour le désastre - il suffit de direcmd
shell. Dans d'autres systèmes, vous pouvez parfois tout citer, caractère NUL inclus. ( stackoverflow.com/questions/2730732/… ) - cette question montre juste que vous devez utiliser un programme externe.En plus des autres réponses, auxquelles je souscris, vous pouvez envisager d'utiliser le
/I
commutateur de laIF
commande.cela peut être utile si vous souhaitez donner à vos utilisateurs une flexibilité insensible à la casse pour spécifier les paramètres.
la source
Vous comparez des chaînes. Si un argument est omis, se
%1
développe en un blanc pour que les commandes deviennentIF =="-b" GOTO SPECIFIC
par exemple (ce qui est une erreur de syntaxe). Mettez vos chaînes entre guillemets (ou crochets).la source
En fait, toutes les autres réponses ont des défauts. Le moyen le plus fiable est:
Explication détaillée:
L'utilisation
"%1"=="-b"
plantera complètement si vous passez un argument avec des espaces et des guillemets. C'est la méthode la moins fiable.L'utilisation
[%1]==[-b]
est meilleure car elle ne plantera pas avec des espaces et des guillemets, mais elle ne correspondra pas si l'argument est entouré de guillemets.L'utilisation
"%~1"=="-b"
est la plus fiable.%~1
supprimera les citations environnantes si elles existent. Cela fonctionne donc avec et sans guillemets, et aussi sans argument.la source
IF [%~1]==[]
- ça marche, et ça gère même"-b"
. Vous devez juste être capable de penser à l' intérieur de la boîte, euh, carré [crochets].J'ai eu des difficultés récemment avec la mise en œuvre de commutateurs de paramètres complexes dans un fichier batch, voici donc le résultat de mes recherches. Aucune des réponses fournies n'est totalement sûre, exemples:
"%1"=="-?"
ne correspondra pas si le paramètre est entre guillemets (nécessaire pour les noms de fichiers, etc.) ou se plantera si le paramètre est entre guillemets et contient des espaces (encore une fois souvent vu dans les noms de fichiers)Toute combinaison avec des crochets
[%1]==[-?]
ou[%~1]==[-?]
échouera si le paramètre contient des espaces entre guillemets:La solution la plus sûre proposée
"%~1"=="-?"
plantera avec un paramètre complexe qui comprend du texte en dehors des guillemets et du texte avec des espaces entre les guillemets:La seule façon de garantir que tous les scénarios ci-dessus sont couverts est d'utiliser EnableDelayedExpansion et de transmettre les paramètres par référence (et non par valeur) à l'aide de variables. Alors même le scénario le plus complexe fonctionnera bien:
la source
Le lot Windows a le mot clé DEFINED pour ce faire.
la source