我会尽可能清楚地解释。我的场景以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
我做错了什么?任何帮助将不胜感激!
谢谢!
安德鲁
答案 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