Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 批处理文件:当传递给函数的参数包含空格时,如何让函数返回值?_Windows_Batch File_Spaces - Fatal编程技术网

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

Windows 批处理文件:当传递给函数的参数包含空格时,如何让函数返回值?,windows,batch-file,spaces,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 :

我会尽量解释清楚。我的场景以一个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
我想要发生的是,传递给函数的“索引”被分配了结果的值,然后我可以将其用于进一步的操作(因为我被卡住了,所以我还没有编写脚本)。发生的情况是,为%2分配了字符串()中第二个单词的值,该字符串作为参数传递给函数。样本输出为:

line1 () CASE1
()
Index is at
line2 () CASE 2
()
Index is at
预期的输出是为
ECHO%2
返回
7
,最终的输出是为读取
索引为7

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

谢谢大家!


Andrew

在脚本中,从头到尾都是变量!指数在任何地方都没有定义。您的索引值实际上存储在变量
中!我
并且您不需要该函数
: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