批处理脚本传递多个参数来调用

我已经写了一个脚本,其中包含一个函数,该函数应该遍历一个列表,并返回给定列表中项目索引的值。 我有一个函数称为:: :find应该采取2个参数:列表和项目的位置。 我不确定如何处理函数中的多个参数。 这个脚本运行良好,如果我在循环内用%MY_LIST%replace%LIST% ,并从参数列表中删除%MY_LIST%传递给call :find ,但我真的想知道如何传递多个参数。 我认为他们只是作为一个整体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 /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 

更新

我的脚本现在工作正常。 感谢nephi12。 http://pastebin.com/xGdFWmnM

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

他们通过相同的参数脚本… ;)

这是另一种方法来对空格分隔的值列表进行索引查找。 定义列表而不用括号括起来。 单词不需要被引用。 带空格,制表符,分号或相等的短语必须引用。 还有特殊字符(如&| 应该引用。

然后颠倒你的:FIND参数的顺序 – 首先是索引,然后是实际列表。 在FOR / L循环中使用SHIFT将所需的索引值存入第一个参数。

这个解决方案的一个优点是它可以支持任意数量的值,只要它们符合每行限制8191个字符。 nephi12解决方案被限制在9个值。

 @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 

试试这个,我认为它回答你的问题。 把它放在一个bat文件中,然后在你看到这个工作之后,建立你需要的东西。 使用命令提示符中的带引号的字符串执行它。 YourBatFile“Arg1 Arg2 Arg3 Etc”

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