Le script Batch transmet plusieurs parameters à appeler

J’ai écrit un script qui contient une fonction qui devrait parcourir une liste et renvoyer une valeur en fonction de l’index de l’élément dans cette liste. J’ai une fonction appelée:: :find qui devrait prendre 2 arguments: la liste et la position de l’élément. Je ne sais pas comment traiter les multiples parameters de la fonction. Ce script fonctionne %MY_LIST% si je remplace %LIST% par %MY_LIST% dans la boucle et que je supprime le %MY_LIST% de la liste d’arguments transmis à l’ call :find , mais je veux vraiment savoir comment transmettre plusieurs arguments. Je suppose qu’ils sont juste passés à la fonction comme une chaîne entière …

 @echo off setlocal enableDelayedExpansion cls :: ---------------------------------------------------------- :: Variable declarations :: ---------------------------------------------------------- set RETURN=-1 set MY_LIST=("foo" "bar" "baz") set TARGET_INDEX=1 :: ---------------------------------------------------------- :: Main procedure :: ---------------------------------------------------------- call :log "Finding item %TARGET_INDEX%..." call :find %MY_LIST% %TARGET_INDEX% call :log "The value is: %RETURN%" goto Exit :: ---------------------------------------------------------- :: Function declarations :: ---------------------------------------------------------- :find call :log "Called `:find` with params: [%*]" set /ai=0 set LIST=%~1 & shift for %%a in %LIST% do ( if !i! == %~1 ( set RETURN=%%a ) set /ai=!i!+1 ) goto:EOF :printDate for /f "tokens=2-4 delims=/ " %%a in ('echo %DATE%') do ( set mydate=%%c/%%a/%%b) for /f "tokens=1-3 delims=/:./ " %%a in ('echo %TIME%') do ( set mytime=%%a:%%b:%%c) echo|set /p="[%mydate% %mytime%] " goto:EOF :log call :printDate echo %~1 goto:EOF :: ---------------------------------------------------------- :: End of script :: ---------------------------------------------------------- :Exit 

Mettre à jour

Mon script fonctionne maintenant correctement; grâce à nephi12. http://pastebin.com/xGdFWmnM

 call :find "%MY_LIST%" %TARGET_INDEX% goto :EOF :find echo %~1 %~2 goto :EOF 

ils sont transmis comme les arguments au script … ;)

Voici une autre méthode pour effectuer une recherche d’index sur une liste de valeurs séparées par des espaces. Définissez la liste sans mettre entre parenthèses. Les mots simples n’ont pas besoin d’être cités. Les phrases avec espace, tabulation, point-virgule ou égal doivent être citées. Aussi des valeurs avec des caractères spéciaux comme & et | devrait être cité.

Inversez ensuite l’ordre de vos arguments: FIND – d’abord l’index, suivi de la liste actuelle. Utilisez SHIFT dans une boucle FOR / L pour obtenir la valeur d’index souhaitée dans le premier argument.

Un des avantages de cette solution est qu’elle peut prendre en charge un nombre quelconque de valeurs, à condition qu’elles s’inscrivent dans la limite de 8 191 caractères par ligne. La solution nephi12 est limitée à 9 valeurs.

 @echo off setlocal set MY_LIST=foo bar baz "Hello world!" call :find %~1 %MY_LIST% echo return=%return% exit /b :find index list... for /L %%N in (1 1 %~1) do shift /1 set "return=%~1" exit /b 

Essayez ceci, je pense que cela répond à votre question. Placez-le dans un fichier de chauve-souris, puis comstackz tout ce dont vous avez besoin après avoir vu ce travail. Exécutez-le avec une chaîne entre guillemets à partir d’une invite de commandes. YourBatFile “Arg1 Arg2 Arg3 Etc”

 @echo off call :DoSomethingWithEach %~1 goto :eof :DoSomethingWithEach for %%a in (%*) do echo.%%a goto :eof