这是我文件的片段:
set checkVal=0
:checkforStart
call set checkSub=%%_input:~%checkVal%,1%%
if /i %checkSub% EQU ( goto parenthesisCheck
if /i %checkSub% EQU ' goto noPar
set /a checkVal=%checkVal% + 1
goto checkforStart
:parenthesisCheck
set /a checkVal=%checkVal% + 1
set _startPar=%checkVal%
:checkforEnd
call set checkSub=%%_input:~%checkVal%,1%%
if /i %checkSub% EQU ) goto endParenthesis
if /i %checkSub% EQU ( goto parenthesisCheck
set /a checkVal=%checkVal% + 1
goto checkforEnd
:endParenthesis
set /a _endPar= %checkVal% - %_startPar%
call set parContents=%%_input=:~%_startPar%,%_endPar%%%
echo Parenthesis: %parContents%
:noPar
pause >nul
goto end
我遇到的问题是,当我尝试返回括号中的内容时,它会返回:
~1,4
沿着这些线条的东西,而不是应该与原始输入隔离的数字或字母。
感谢您的帮助。
以下是完整档案,如果您需要:https://www.dropbox.com/s/2lljcy5t7qme0nb/substring%20parenthesis%20finder.txt
答案 0 :(得分:3)
如果在未定义var时尝试执行类似set val=%var:~1,4%
的操作,那么这将是您获得的值。如果变量未定义,子串和搜索/替换操作将无法正常工作 - 而是在冒号后返回指令。这正是您所拥有的情况,因为您的最终作业在表达式中有一个不需要的=
。
你有:
call set parContents=%%_input=:~%_startPar%,%_endPar%%%
因此,它希望从名为_input=
的变量中提取子字符串,该变量不可能存在 - 用户定义的变量名称不能包含=
。
删除=
call set parContents=%%_input:~%_startPar%,%_endPar%%%
答案 1 :(得分:0)
您应该在脚本开头启用延迟展开,并使用!
代替周围的%
符号。
setLocal enableDelayedExpansion
set checkSub=!_input:~%checkVal%,1!
set parContents=!_input=:~%_startPar%,%_endPar%!
注意,您将checkSub
变量设置了两次,两次都完全相同,所以我没有将它包括两次。您需要更改三行,并添加一行。
答案 2 :(得分:0)
....
:endParenthesis
set /a _endPar= %checkVal% - %_startPar%
CALL :inpar %_startPar% %_endPar%
echo Parenthesis: %parContents%
:noPar
GOTO :EOF
:inpar
CALL set parContents=%%_input:~%1,%2%%
GOTO :eof
这对我有用......
答案 3 :(得分:0)
似乎使用&&
的一行我没有在这里发帖导致了这个问题。抱歉,麻烦。