Lot-Script - Itérer à travers les arguments
J'ai un lot de script avec plusieurs arguments. Je lis le nombre total d'entre eux et l'exécution d'une boucle for comme ceci:
@echo off
setlocal enabledelayedexpansion
set argCount=0
for %%x in (%*) do set /A argCount+=1
echo Number of processed arguments: %argCount%
set /a counter=0
for /l %%x in (1, 1, %argCount%) do (
set /a counter=!counter!+1 )
Ce que je veux faire maintenant, c'est d'utiliser ma course variable (x
ou counter
) pour accéder à des arguments d'entrée. Je pense aobut quelque chose comme ceci:
REM Access to %1
echo %(!counter!)
Dans un monde idéal, cette ligne doit imprimer mon premier argument de ligne de commande, mais évidemment, il ne le fait pas. Je sais que je fais quelque chose de mal avec l' %
de l'opérateur, mais est-il de toute façon j'ai pu accéder à mes arguments comme cela?
//edit: Juste pour clarifier les choses, le problème est que %(!counter!)
me donne la valeur de la variable counter
. Sens pour counter=2
il me donne 2
et non pas le contenu de %2
.
- si les arguments sont plus que 9 vous ne pouvez pas accéder à toutes, sans
shift
- C'est une autre question que je pourrais rencontrer, mais nous allons simplement supposer que je vais avoir moins de 10 arguments
- Aussi,
for %%x in (%*) do ...
ne donnera pas le résultat souhaité si un paramètre contient*
ou?
caractère. J'ai toujours utiliser un GOTO boucle avec la touche SHIFT si je veux charger les paramètres dans un tableau de variables.
Vous devez vous connecter pour publier un commentaire.
voici un moyen pour accéder à la seconde (par exemple) argument (ce qui peut être mis en /l de la boucle):
donc:
%!counter!
me donne la valeur de la variablecounter
et non le contenu de%2
argtester.bat a b
et la sortie estb
set "_var=%%!counter!"
.vous avez besoin d'une variable temp parce que si elle ne peut être appeléeif "!_var!" equ "something" echo this is something
"
autour de l'ensembleset
appel?a safe
stratégie. ceci vous permet d'inclure des caractères spéciaux dans la valeur comme|&><....
et de vous assurer qu'il n'y a pas d'espace supplémentaire à la fin (qui dans certains cas pourrait briser votre logique)_var
,_var
aussi juste contient%1
etc (à l'aide deecho !_var!
) - Lorsque j'utilisecall echo !_var!
- je obtenir le contenu une fois encore le problème est quand j'utilise_var
dans monif
appel (comme vous le suggérez) malheureusement il ne fonctionne pascall set
...l'appel qui a été accidentellement laissé à l'extérieur du gris bckg.call set "_var=%%!counter!"
for /l %%x in (1 1 %argCount%) do call echo %%%%x
? Ou de jeter dans l'ENSEMBLE si vous le souhaitez. Mais je n'aime pas les OP de base de l'approche. La seule approche fiable que je connaisse est d'utiliser un GOTO boucle et de passer à définir un "tableau" de valeurs de paramètre.Par exemple:
Un autre:
Si pour avoir un code court plutôt que sage, alors
Cela devrait montrer comment extraire des paramètres aléatoires par position.
Pour la simple itération ne peut-on pas vérifier les autres arguments avec "shift /1" à la fin du code et de la boucle de retour? Cela permettra de traiter plus de 10 arguments, limite supérieure non testé.