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 ?

3voto

D.Barev Points 31

Je me suis efforcé récemment de mettre en œuvre des commutations 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 à l'appui :

"%1"=="-?" ne correspondra pas si le paramètre est entre guillemets (nécessaire pour les noms de fichiers, etc.) ou plantera si le paramètre est entre guillemets et contient des espaces (ce qui se produit souvent dans les noms de fichiers).

@ECHO OFF
SETLOCAL
echo.
echo starting parameter test...
echo.
rem echo First parameter is %1
if "%1"=="-?" (echo Condition is true, param=%1) else (echo Condition is false, param=%1)
C:\>test.bat -?

starting parameter test...

Condition is true, param=-?

C:\>test.bat "-?"

starting parameter test...

Condition is false, param="-?"

Toute combinaison avec des crochets [%1]==[-?] ou [%~1]==[-?] échouera si le paramètre contient des espaces entre guillemets :

@ECHO OFF
SETLOCAL 
echo.
echo starting parameter test...
echo.
echo First parameter is %1
if [%~1]==[-?] (echo Condition is true, param=%1) else (echo Condition is false, param=%1)

C:\>test.bat "long file name"

starting parameter test...

First parameter is "long file name"
file was unexpected at this time.

La solution la plus sûre proposée "%~1"=="-?" se plantera avec un paramètre complexe qui comprend du texte en dehors des guillemets et du texte avec des espaces entre les guillemets :

@ECHO OFF
SETLOCAL 
echo.
echo starting parameter test...
echo.
echo First parameter is %1
if "%~1"=="-?" (echo Condition is true, param=%1) else (echo Condition is false, param=%1)

C:\>test.bat -source:"long file name"

starting parameter test...

First parameter is -source:"long file name"
file was unexpected at this time.

La seule façon de s'assurer que tous les scénarios susmentionnés sont couverts est d'utiliser la fonction Activer l'expansion différée et de transmettre les paramètres par référence (et non par valeur) en utilisant des variables. Ainsi, même le scénario le plus complexe fonctionnera parfaitement :

@ECHO OFF
SETLOCAL EnableDelayedExpansion
echo.
echo starting parameter test...
echo.
echo First parameter is %1
:: we assign the parameter to a variable to pass by reference with delayed expansion
set "var1=%~1"
echo var1 is !var1!
:: we assign the value to compare with to a second variable to pass by reference with delayed expansion
set "var2=-source:"c:\app images"\image.png"
echo var2 is !var2!
if "!var1!"=="!var2!" (echo Condition is true, param=!var1!) else (echo Condition is false, param=!var1!)
C:\>test.bat -source:"c:\app images"\image.png

starting parameter test...

First parameter is -source:"c:\app images"\image.png
var1 is -source:"c:\app images"\image.png
var2 is -source:"c:\app images"\image.png
Condition is true, param=-source:"c:\app images"\image.png

C:\>test.bat -source:"c:\app images"\image1.png

starting parameter test...

First parameter is -source:"c:\app images"\image1.png
var1 is -source:"c:\app images"\image1.png
var2 is -source:"c:\app images"\image.png
Condition is false, param=-source:"c:\app images"\image1.png

C:\>test.bat -source:"c:\app images\image.png"

starting parameter test...

First parameter is -source:"c:\app images\image.png"
var1 is -source:"c:\app images\image.png"
var2 is -source:"c:\app images"\image.png
Condition is false, param=-source:"c:\app images\image.png"

1voto

gil.fernandes Points 5581

Cette question a déjà reçu de très bonnes réponses, mais toutes les réponses semblent insister sur l'utilisation d'un goto .

Si vous ne souhaitez pas utiliser un goto en 2023 avec Windows 10, ce qui est une légère complication, vous pouvez simplement utiliser des parenthèses ( ) après la if déclaration.

Vous pouvez donc créer un fichier batch comme celui-ci :

@echo off

if "%~1"=="full" (
echo hello
echo hello again
)

echo hello always

Si vous l'exécutez en utilisant cette ligne de commande : if_argument_test.bat full vous verrez :

hello
hello again
hello always

Si vous l'exécutez sans l'option full vous verrez ceci :

hello always

Le code batch est tout simplement plus propre sans le goto .

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