批处理文件:当传递给该函数的参数包含空格时,如何让函数返回值?

时间:2014-08-29 06:56:54

标签: windows batch-file spaces

我会尽可能清楚地解释。我的场景以txt文件开头,Cases.txt,包含两行:

line1 () CASE1
line2 () CASE 2

批处理文件使用FOR循环遍历该文件,并将每一行传递给函数find_index,该函数提取(并应返回)')的位置。字符。这是我无法工作的代码:

@ECHO off
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /f "delims=" %%a IN (cases.txt) DO (
    ECHO %%a
    CALL :find_index %%a INDEX
    ECHO Found index at !INDEX!
)
GOTO :EOF

:find_index
    set S=%*
    set I=0
    set L=-1
    :l
        if "!S:~%I%,1!"=="" goto ld
        if "!S:~%I%,1!"==")" set L=%I%
        set /a I+=1
        goto l
    :ld
        SET %2 = %L%
        ECHO %2
        GOTO :EOF

我想要发生的是" INDEX"被传递给函数的函数被赋予结果的值,然后我可以将其用于进一步的操作(我还没有编写脚本,因为我被卡住了)。会发生的是,%2被赋予string()中第二个单词的值,该值作为参数传递给函数。示例输出为:

line1 () CASE1
()
Index is at
line2 () CASE 2
()
Index is at

预期输出为ECHO %2返回7,最终输出为Index is at 7

我做错了什么?任何帮助将不胜感激!

谢谢!

安德鲁

1 个答案:

答案 0 :(得分:1)

在你的脚本中,从最开始到结尾变量!INDEX!没有在任何地方定义。您的索引值实际存储在变量!L!中,您不需要该函数:ld。请参阅以下修改过的脚本和示例输出。

@ECHO off
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /f "delims=" %%a IN (cases.txt) DO (
    ECHO %%a
    CALL :find_index %%a INDEX
    ECHO Found index at !L!
)
GOTO :EOF

:find_index
    set S=%*
    set I=0
    set L=-1
    :l
        if "!S:~%I%,1!"=="" goto :EOF
        if "!S:~%I%,1!"==")" set L=%I%
        set /a I+=1
        goto l
        GOTO :EOF

测试输出 -

D:\Scripts>type cases.txt
line1 () CASE1
line2 () CASE 2
sometext () case3
D:\Scripts>
D:\Scripts>
D:\Scripts>
D:\Scripts>draft.bat
line1 () CASE1
Found index at 7
line2 () CASE 2
Found index at 7
sometext () case3
Found index at 10

干杯,G