Il suffit de convertir certains scripts shell en fichiers batch et il y a une chose que je n'arrive pas à trouver ... et c'est un simple décompte du nombre d'arguments de ligne de commande.
par exemple. si tu as:
myapp foo bar
Dans Shell:
- $ # -> 2
- $ * -> foo bar
- 0 $ -> myapp
- $ 1 -> toto
- 2 $ -> barre
En lot
- ?? -> 2 <---- quelle commande?!
- % * -> foo bar
- % 0 -> myapp
- % 1 -> toto
- % 2 -> barre
J'ai donc regardé autour de moi, et soit je regarde au mauvais endroit, soit je suis aveugle, mais je n'arrive pas à trouver un moyen d'obtenir le nombre d'arguments de ligne de commande transmis.
Existe-t-il une commande similaire à "$ #" du shell pour les fichiers batch?
ps. le plus proche que j'ai trouvé est d'itérer à travers les% 1 et d'utiliser 'shift', mais je dois me référer à% 1,% 2 etc. plus tard dans le script donc ce n'est pas bon.
2 myapp foo bar
?Réponses:
Googler un peu vous donne le résultat suivant des wikibooks :
On dirait que cmd.exe a un peu évolué depuis l'ancien temps DOS :)
la source
for
ne fonctionne que pour les arguments qui ressemblent à des noms de fichiers, pas pour les chaînes d'options telles que-?
. L'utilisation de quotes (for %%i in ("%*") ...
) fonctionne pour l'argument comme-?
mais échoue encore une fois pour les arguments entre guillemets en raison des guillemets imbriqués. Le seul moyen robuste semble impliquershift
...MyBatchFile "*.*" "Abc"
rapporte que argC == 9. - Vote défavorable.Vous avez tendance à gérer le nombre d'arguments avec ce type de logique:
etc.
Si vous avez plus de 9 arguments, vous êtes foutu avec cette approche. Il existe divers hacks pour créer des compteurs que vous pouvez trouver ici , mais sachez que ce ne sont pas pour les timides.
la source
shift
compter plus de 9 ... et sans avoir 10 lignes de code de même apparence.La fonction
:getargc
ci-dessous peut être ce que vous recherchez.Il itère essentiellement une fois sur la liste (qui est locale à la fonction afin que les décalages n'affectent pas la liste dans le programme principal), en les comptant jusqu'à ce qu'elle s'épuise.
Il utilise également une astuce astucieuse, en passant le nom de la variable de retour à définir par la fonction.
Le programme principal illustre simplement comment l'appeler et fait écho aux arguments par la suite pour s'assurer qu'ils sont intacts:
la source
echo Count is %argc%
vous inséreriez votre propre code qui pourrait vérifier si ce décompte est correct, puis passer à autre chose.Essaye ça:
la source
Si le nombre d'arguments doit être un nombre exact (inférieur ou égal à 9), voici un moyen simple de le vérifier:
la source
Évite d'utiliser l'un
shift
ou l' autre ou unfor
cycle au détriment de la taille et de la lisibilité.Production:
EDIT: Le "truc" utilisé ici implique:
Construire une chaîne qui représente une variable d'argument de ligne de commande actuellement évaluée (c'est-à-dire "% 1", "% 2" etc.) en utilisant une chaîne qui contient un caractère de pourcentage (
%%
) et une variable de compteurarg_idx
à chaque itération de boucle.Stocker cette chaîne dans une variable
curr_arg_label
.Passer à la fois cette chaîne (
!curr_arg_label!
) et le nom d'une variable de retour (curr_arg_value
) à un sous-programme primitifget_value
.Dans le sous-programme, la valeur de son premier argument (
%1
) est utilisée sur le côté gauche d'affectation (set
) et la valeur de son second argument (%2
) sur la droite. Cependant, lorsque l'argument du deuxième sous-programme est passé, il est résolu en valeur de l'argument de ligne de commande du programme principal par l'interpréteur de commandes. Autrement dit, ce qui est passé n'est pas, par exemple, "% 4" mais quelle que soit la valeur de la quatrième variable d'argument de ligne de commande ("another_arg" dans l'exemple d'utilisation).Ensuite, la variable donnée au sous-programme comme variable de retour (
curr_arg_value
) est testée pour être indéfinie, ce qui se produirait si l'argument de ligne de commande actuellement évalué est absent. Au départ, il s'agissait d'une comparaison de la valeur de la variable de retour placée entre crochets et de crochets vides (ce qui est le seul moyen que je connaisse pour tester les arguments de programme ou de sous-programme qui peuvent contenir des guillemets et qui était un reste négligé de la phase d'essai et d'erreur) mais a depuis été fixé à ce qu'il est maintenant.la source
La dernière réponse remonte à deux ans maintenant, mais j'avais besoin d'une version pour plus de neuf arguments de ligne de commande. Peut-être qu'un autre le fait aussi ...
La solution est les 19 premières lignes et convertit tous les arguments en variables dans un style c-like. Tous les autres éléments analysent simplement le résultat et affichent la conversion en arguments locaux. Vous pouvez référencer des arguments par index dans n'importe quelle fonction.
la source
Une solution robuste consiste à déléguer le comptage à un sous - programme appelé avec
call
; le sous-programme utilise desgoto
instructions pour émuler une boucle dans laquelleshift
est utilisé pour consommer les arguments (sous-programme uniquement) de manière itérative:la source