Mr. Polywhirl
Mr. Polywhirl

Reputation: 48600

Batch script pass multiple parameters to call

I have written a script that contains a function that should loop through a list and return a value given the index of the item in said list. I have a function called: :find that should take 2 arguments: the list and the item position. I am unsure of how to process the multiple parameters in the function. This script runs fine if I replace %LIST% with %MY_LIST% inside the loop and I remove the %MY_LIST% from the argument list tht is passed to call :find, but I really want to know how to pass multiple arguments. I take it that they are just passed to the function as a whole string...

@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 /a i=0
set LIST=%~1 & shift

for %%a in %LIST% do (
    if !i! == %~1 (
        set RETURN=%%a
    )
    set /a i=!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

Update

My script now works fine; thanks to nephi12. http://pastebin.com/xGdFWmnM

Upvotes: 3

Views: 20640

Answers (3)

cure
cure

Reputation: 2688

call :find "%MY_LIST%" %TARGET_INDEX%
goto :EOF

:find
echo %~1 %~2
goto :EOF

they are passed the same as args to the script... ;)

Upvotes: 7

dbenham
dbenham

Reputation: 130819

Here is another method to do an index lookup on a space delimited list of values. Define the list without enclosing parentheses. Single words don't need to be quoted. Phrases with space, tab, semicolon, or equal must be quoted. Also values with special characters like & and | should be quoted.

Then reverse the order of your :FIND arguments - first the index, followed by the actual list. Use SHIFT in a FOR /L loop to get the desired index value into the first argument.

One advantage of this solution is that it can support any number of values, as long as they fit within the 8191 character per line limit. The nephi12 solution is limited to 9 values.

@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

Upvotes: 4

RGuggisberg
RGuggisberg

Reputation: 4750

Try this, I think it answers your question. Put it in a bat file and then build whatever else you need around it after you see this work. Execute it with a quoted string from a command prompt. YourBatFile "Arg1 Arg2 Arg3 Etc"

@echo off
call :DoSomethingWithEach %~1
goto :eof

:DoSomethingWithEach
for %%a in (%*) do echo.%%a
goto :eof

Upvotes: 2

Related Questions