3

我编写了一个脚本,其中包含一个函数,该函数应该遍历一个列表并在给定所述列表中项目的索引的情况下返回一个值。我有一个名为: 的函数:find应该有 2 个参数:列表和项目位置。我不确定如何处理函数中的多个参数。如果我在循环内替换为 并从传递给的参数列表中删除 ,%LIST%则此脚本运行良好,但我真的很想知道如何传递多个参数。我认为它们只是作为一个完整的字符串传递给函数......%MY_LIST%%MY_LIST%call :find

@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

更新

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

4

3 回答 3

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

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

它们与 args 一样传递给脚本...;)

于 2013-10-22T23:35:58.013 回答
4

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

然后颠倒 :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
于 2013-10-23T03:37:52.460 回答
2

试试这个,我想它回答了你的问题。把它放在一个 bat 文件中,然后在你看到这个工作之后围绕它构建你需要的任何其他东西。在命令提示符下使用带引号的字符串执行它。YourBatFile "Arg1 Arg2 Arg3 等"

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

:DoSomethingWithEach
for %%a in (%*) do echo.%%a
goto :eof
于 2013-10-23T01:27:51.003 回答