Windows fichier Bat argument optionnel analyse
J'ai besoin de mon fichier bat pour accepter plusieurs facultatif arguments nommés.
mycmd.bat man1 man2 -username alice -otheroption
Pour exemple ma commande a 2 paramètres obligatoires, et les deux paramètres facultatifs (- ), nom d'utilisateur qui a une valeur de l'argument d'alice, et -otheroption:
J'aimerais être en mesure d'arracher ces valeurs dans des variables.
Juste de lancer un appel à toute personne qui a déjà réglé ce problème. Homme de ces fichiers bat sont une douleur.
- Aucune raison pourquoi vous devez le faire dans un fichier BAT et ne pas dire en VBScript? Il y a peut être un moyen de le faire dans un fichier BAT, mais en collant le fichier BAT approche, vous "vous êtes dans un monde de douleur, de fils". 🙂
- Encore mieux est d'utiliser PowerShell. Il a très avancé et intégré dans la gestion des paramètres.
- vous avez probablement raison, mais je suis très VBScript-phobique. Si jamais je me suis trouvé avoir à utiliser VBScript je pense que j'avais déjà être dans un monde de douleur. J'ai serons ravis de vous écrire moi-même un fichier batch pour automatiser quelque chose, alors peut-être que si je veux le rendre plus utile pour les gens, alors je vais ajouter quelques arguments. Souvent, certaines de ces options sont facultatives. À aucun moment, depuis que j'ai quitté le monde bancaire ai-je pensé, ou quelqu'un a suggéré "que vous aurez envie VBScript pour que".
- Le lien ne fonctionne plus. Wayback machine version ne. Je ne sais pas si je modifier votre commentaire si Il va changer de look comme je l'ai fait au travail ou non, je vais juste t o coller ici:
http://web.archive.org/web/20090403050231/http://www.pcguide.com/vb/showthread.php?t=52323
.
Vous devez vous connecter pour publier un commentaire.
Bien que j'ai tendance à être d'accord avec @AlekDavis' commentaire, il y a cependant plusieurs façons de le faire dans le NT shell.
L'approche que je pourrais profiter de la MAJ de commande et SI branchements conditionnels, quelque chose comme ça...
SHIFT /2
changements de départ à arg 2. Il ne passe pas deux fois. Ne devrait-il pas être remplacé parSHIFT & SHIFT
?mycmd.bat -username anyvalue -username myName -otheroption othervalue
. Le résultat devrait être de l'utilisateur=monnom, autres=othervalue; mais le code donne à l'utilisateur=-nom d'utilisateur, autres=othervalue. Le bug est corrigé par le remplacement deSHIFT /2
avecSHIFT & SHIFT
.SHIFT & SHIFT
?SET man1=%1
etSET man2=%2
) sont l'apprentissage de la première et de la deuxième arguments, qui sont la position et obligatoire. LeSHIFT & SHIFT
faut juste sortir de la file d'attente de sorte que plus tard, les commandes qui cherchent --options ne les vois pas. Il pourrait être de deux lignes séparées de seulementSHIFT
, j'ai choisi le&
pour économiser de l'espace -- vous pouvez utiliser un point-virgule à la place.;
- il ne peut pas être utilisé à la place de&
.%1
et%2
ont été "Utilisés". b) Le seulSHIFT
en ligne 11 déplace la valeur de%2
bas 1 position et est ensuite disponible (encore une fois) que%1
, et de l'état "Inutilisé" de la valeur de%3
est disponible en%2
. c) LaIF
en ligne 13 voit déjà "Utilisé" valeur de%2
qui est maintenant dans%1
. d) Si le "nom d'utilisateur" à partir de la ligne 10 ressemble"-otheroption"
, il sera utilisé de nouveau etother
sera réglé à la nouvelle valeur dans%2
, ce qui était sans doute le nom de l'option suivante. --->SHIFT
dans les lignes 11, 15, et 17 ans enlever les 3 éléments de la liste d'arguments. f) La nouvelle valeur dans%1
est probablement la valeur qui a été destiné à être stocké dansother
, mais il silencieusement être ignoré. 2 façons de résoudre ce problème: 1) À la ligne 11, ajouter un autreSHIFT
et unGOTO :loop
. Ou 2) de Changer les 2 internesIF
états dansIF
---ELSE IF
, comme:) ELSE (IF "%1"=="-otheroption"...
. --->-otheroption
n'a pas été suivie par une valeur, donc il a probablement été conçu comme un-Flag
de l'option type, et ne devraient pas consommer un 2ème argument. 3ème: Si l'argument%1
n'est pas géré en interne par lesIF
états, il est ignoré en silence. Le code devrait probablement afficher un message indiquant qu'il n'était pas une option valable. Cela pourrait être fait par l'ajout nécessaireSHIFT
etGOTO :loop
états dans l'intérieur de laIF
états, ou par l'ajout d'uneELSE
déclaration.-username
et-otheroption
, les variables de garder les valeurs, Et si vous exécutez à nouveau le code, sans ces paramètres, vous pouvez voir les valeurs précédentes pourUsername
etOther
. Je pense doit être réinitialiser les variables dans la première de code avec ce code:SET user= & SET other=
%~1
et%~2
au lieu de%1
et%2
pour ignorer les double quote ("
) à la fois du côté des valeurs.La réponse sélectionnée fonctionne, mais il pourrait utiliser un peu d'amélioration.
Ma solution s'appuie sur la création d'une variable qui définit toutes les options et leurs valeurs par défaut. OPTIONS est également utilisé pour tester si une option est valide. Une énorme quantité de code est enregistré par tout simplement de stocker les valeurs d'option dans les variables avec le même nom que l'option. La quantité de code est constante indépendamment de la façon dont de nombreuses options sont définies; seules les OPTIONS de définition de a à changer.
MODIFIER - Aussi, l' :code de boucle doit changer si le nombre de obligatoire des arguments de position changements. Par exemple, souvent, tous les arguments sont nommés, dans le cas où vous voulez analyser les arguments en commençant à la position 1 au lieu de 3. Donc, dans l' :boucle, tous les 3 se 1, et 4 se 2.
Il n'y a vraiment pas beaucoup de code. La plupart du code ci-dessus est commentaires. Ici est exactement le même code, sans les commentaires.
Cette solution offre le style Unix arguments à l'intérieur d'un de commandes Windows. Ce n'est pas la norme pour Windows - lot possède normalement les options précédant les arguments requis et les options sont préfixés avec
/
.Les techniques utilisées dans cette solution sont facilement adaptés à un style de Fenêtres d'options.
%1
, et il continue jusqu'à l'arg 1 ne commence pas avec/
/
.SET /VAR=VALUE
échoueSET "/VAR=VALUE"
œuvres. Je fais déjà dans ma solution de toute façon./
. Cette limitation peut être éliminé en utilisant un implicitement défini//
option qui sert de signal pour quitter l'option d'analyse de la boucle. Rien ne serait stocké pour le//
"option".Mise à jour 2015-12-28: Soutien pour
!
dans les valeurs de l'optionDans le code ci-dessus, chaque argument est élargi tout en expansion retardée est activé, ce qui signifie que
!
sont les plus susceptibles dépouillé, ou bien quelque chose comme!var!
est élargi. En outre,^
peut également être dépouillé si!
est présent. Suivant la petite modification de l'onu, a commenté code supprime la limitation tels que!
et^
sont conservés dans les valeurs de l'option.Si vous souhaitez utiliser les arguments optionnels, mais pas les arguments nommés, alors cette approche a fonctionné pour moi. Je pense que c'est beaucoup plus facile de code à suivre.
IF "%1"==""
échouera si l'argument contient des citations d'elle-même. Juste l'utilisation de toute autre non-symbole spécial au lieu de cela, comme ._=[]# etcUne fois, j'avais écrit un programme qui gère le court (-h), long (--help) et non les arguments d'option dans le fichier de commandes.
Cette techniques comprend:
non-arguments d'option suivie par une option arguments.
opérateur de décalage pour ceux qui ont pas d'argument comme "--help".
deux fois opérateur de décalage pour ces options qui nécessitent un argument.
boucle par le biais d'un label pour le traitement de tous les arguments de ligne de commande.
Sortie de script et d'arrêter le traitement de ces options que pas besoin de demander d'autres mesures comme "--help".
A écrit les fonctions d'aide pour l'utilisateur guidiness
Voici mon code.
Voici les arguments de l'analyseur. Vous pouvez mélanger tous les arguments de chaîne (gardé intacte) ou échappé options (unique ou paires option/valeur). Pour tester, décommenter les 2 dernières déclarations et exécuter en tant qu':
Escape char est défini comme
"_SEP_=/"
, redéfinir si nécessaire.