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"
0 votes
Si vous ajoutez des parenthèses (comme dans l'exemple
GOTO BLANK
) vers les deux autresIF
Cela résout-il le problème ?