95 votes

Analyse des arguments facultatifs du fichier Bat de Windows

J'ai besoin que mon fichier bat accepte plusieurs arguments optionnels nommés.

mycmd.bat man1 man2 -username alice -otheroption

Par exemple ma commande a 2 paramètres obligatoires, et deux paramètres optionnels (-username) qui a une valeur d'argument de alice, et -otheroption :

J'aimerais pouvoir transformer ces valeurs en variables.

Je lance un appel à tous ceux qui ont déjà résolu ce problème. Ces fichiers bat sont une douleur.

14 votes

Y a-t-il une raison pour laquelle vous devez faire cela dans un fichier BAT et non en VBScript ? Il y a peut-être un moyen de le faire dans un fichier BAT, mais si vous vous en tenez à cette approche, vous "entrez dans un monde de douleur, fiston" :-)

0 votes

Le mieux est encore d'utiliser PowerShell. Il dispose d'une gestion des paramètres très avancée et intégrée.

2 votes

@AlekDavis, vous avez probablement raison, mais je suis extrêmement phobique du VBScript. Si je me retrouvais un jour à devoir utiliser VBScript, je pense que je serais déjà dans un monde de douleur. Je me contenterai d'écrire un fichier batch pour automatiser quelque chose, et si je veux le rendre plus utile aux gens, j'ajouterai des arguments. Souvent, certains de ces arguments sont facultatifs. Depuis que j'ai quitté le monde de la banque, je n'ai jamais pensé, ou quelqu'un m'a suggéré, que je devais utiliser du VBScript pour cela.

1voto

Oscar Points 11

Voici l'analyseur d'arguments. Vous pouvez mélanger n'importe quel argument de type chaîne (gardé intact) ou options échappées (simple ou paires option/valeur). Pour le tester, décommentez les 2 dernières déclarations et exécutez comme :

getargs anystr1 anystr2 /test$1 /test$2=123 /test$3 str anystr3

Le caractère d'échappement est défini comme suit "_SEP_=/" redéfinir si nécessaire.

@echo off

REM Command line argument parser. Format (both "=" and "space" separators are supported):
REM   anystring1 anystring2 /param1 /param2=value2 /param3 value3 [...] anystring3 anystring4
REM Returns enviroment variables as:
REM   param1=1
REM   param2=value2
REM   param3=value3
REM Leading and traling strings are preserved as %1, %2, %3 ... %9 parameters
REM but maximum total number of strings is 9 and max number of leading strings is 8
REM Number of parameters is not limited!

set _CNT_=1
set _SEP_=/

:PARSE

if %_CNT_%==1 set _PARAM1_=%1 & set _PARAM2_=%2
if %_CNT_%==2 set _PARAM1_=%2 & set _PARAM2_=%3
if %_CNT_%==3 set _PARAM1_=%3 & set _PARAM2_=%4
if %_CNT_%==4 set _PARAM1_=%4 & set _PARAM2_=%5
if %_CNT_%==5 set _PARAM1_=%5 & set _PARAM2_=%6
if %_CNT_%==6 set _PARAM1_=%6 & set _PARAM2_=%7
if %_CNT_%==7 set _PARAM1_=%7 & set _PARAM2_=%8
if %_CNT_%==8 set _PARAM1_=%8 & set _PARAM2_=%9

if "%_PARAM2_%"=="" set _PARAM2_=1

if "%_PARAM1_:~0,1%"=="%_SEP_%" (
  if "%_PARAM2_:~0,1%"=="%_SEP_%" (
    set %_PARAM1_:~1,-1%=1
    shift /%_CNT_%
  ) else (
    set %_PARAM1_:~1,-1%=%_PARAM2_%
    shift /%_CNT_%
    shift /%_CNT_%
  )
) else (
  set /a _CNT_+=1
)

if /i %_CNT_% LSS 9 goto :PARSE

set _PARAM1_=
set _PARAM2_=
set _CNT_=

rem getargs anystr1 anystr2 /test$1 /test$2=123 /test$3 str anystr3
rem set | find "test$"
rem echo %1 %2 %3 %4 %5 %6 %7 %8 %9

:EXIT

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