135 votes

Comment vérifier les paramètres de la ligne de commande dans un fichier ".bat" ?

Mon système d'exploitation est Windows Vista. J'ai besoin d'un fichier ".bat" dans lequel je dois vérifier si l'utilisateur entre un paramètre de ligne de commande ou non. Si c'est le cas, alors si le paramètre est égal à -b alors je ferai quelque chose, sinon je signalerai "Entrée non valide". Si l'utilisateur ne saisit aucun paramètre de la ligne de commande, je ferai quelque chose. J'ai créé le fichier .bat suivant. Il fonctionne pour -b et non égal à -b mais il échoue lorsque l'utilisateur ne fournit 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 travers ?


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!

0 votes

Si vous ajoutez des parenthèses (comme dans l'exemple GOTO BLANK ) vers les deux autres IF Cela résout-il le problème ?

186voto

afrazier Points 2290

Vous devez vérifier si le paramètre est vide : if "%~1"=="" goto blank

Une fois que vous avez fait cela, faites un switch if/else sur -b : if "%~1"=="-b" (goto specific) else goto unknown

Le fait d'entourer les paramètres de guillemets facilite la vérification des paramètres vides ou manquants. "~" garantit que les guillemets doubles sont supprimés s'ils se trouvaient dans l'argument de la ligne de commande.

0 votes

Cela fonctionne ! Seul "else" n'est pas accepté. J'obtiens l'erreur suivante : "else" n'est pas reconnu comme une commande interne ou externe, un programme opérationnel ou un fichier batch. J'ai donc ajouté un autre IF pour le cas "not equal to -b". Merci pour votre réponse rapide.

7 votes

Le ELSE doit se trouver sur la même ligne que le IF, ou directement après une parenthèse.

4 votes

Cela ne semble pas fonctionner pour moi si %1 contient des espaces, ce qui peut être le cas s'il s'agit du chemin complet d'un exécutable. Voir Réponse de Jeremiah Willcock pour une solution qui fonctionne même pour les paramètres dont les valeurs contiennent des espaces.

34voto

Jeremiah Willcock Points 14674

Regarder http://ss64.com/nt/if.html pour une réponse ; la commande est IF [%1]==[] GOTO NO_ARGUMENT ou similaire.

1 votes

Non seulement cela fonctionne AUSSI ! Il fonctionne tout simplement, contrairement à "%1"=="" . Je dois développer ce point dans ma propre réponse.

1 votes

Cela ne fonctionnera pas si %1 est entre guillemets, par exemple foo.bat "1st parameter" 2nd_param . Voir stackoverflow.com/questions/2541767/

0 votes

L'utilisation [%1]==[-b] ne correspondra pas si arg est cité. Exemple run.bat "-b" . Voir stackoverflow.com/a/46942471

10voto

wisbucky Points 829

En fait, toutes les autres réponses ont des défauts. La méthode la plus fiable est la suivante :

IF "%~1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN)

Explication détaillée :

L'utilisation "%1"=="-b" va se planter si l'argument passe avec des espaces et des guillemets. C'est la méthode la moins fiable.

IF "%1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN)

C:\> run.bat "a b"

b""=="-b" was unexpected at this time.

Utilisation [%1]==[-b] est meilleur car il ne se plante pas avec les espaces et les guillemets, mais il ne correspondra pas si l'argument est entouré de guillemets.

IF [%1]==[-b] (GOTO SPECIFIC) ELSE (GOTO UNKNOWN)

C:\> run.bat "-b"

(does not match, and jumps to UNKNOWN instead of SPECIFIC)

Utilisation "%~1"=="-b" est le plus fiable. %~1 supprimera les guillemets environnants s'ils existent. Il fonctionne donc avec et sans guillemets, ainsi qu'en l'absence d'arguments.

IF "%~1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN)

C:\> run.bat
C:\> run.bat -b
C:\> run.bat "-b"
C:\> run.bat "a b"

(all of the above tests work correctly)

9voto

PA. Points 10538

En plus des autres réponses auxquelles je souscris, vous pouvez envisager d'utiliser l'application /I de l'interrupteur de la IF commande.

... le commutateur /I, s'il est spécifié, indique qu'il faut effectuer des comparaisons de chaînes insensibles à la casse.

il peut être utile si vous souhaitez donner à vos utilisateurs une flexibilité insensible à la casse pour spécifier les paramètres.

IF /I "%1"=="-b" GOTO SPECIFIC

8voto

Jeff Mercado Points 42075

Vous comparez des chaînes de caractères. Si un argument est omis, %1 s'étend à un espace vide, de sorte que les commandes deviennent IF =="-b" GOTO SPECIFIC par exemple (ce qui est une erreur de syntaxe). Mettez vos chaînes de caractères entre guillemets (ou crochets).

REM this is ok
IF [%1]==[/?] GOTO BLANK

REM I'd recommend using quotes exclusively
IF "%1"=="-b" GOTO SPECIFIC

IF NOT "%1"=="-b" GOTO UNKNOWN

0 votes

IF [%1]==[/ ?] ne fonctionne pas mais si je fais IF [%1]==[] ou "%1"=="", cela fonctionne. Quoi qu'il en soit, je peux maintenant commencer à travailler. Je vous remercie pour votre réponse rapide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X