我已经浏览了一些字符串操作例程,并且我知道我可以用其他几种语言来完成这个,但为了简单起见,我想在批处理文件中使用它。
我希望在XML文件中搜索标记并从中提取所有内容到文件的末尾。
所以我猜,例如在伪javascript中:
marketIndex = str.indexOf("<Markets>");
length = str.length;
marketString = str.substring(markeIndex, length-1);
return str;
我在bat中有一个子串函数:
:Substring
::Substring(retVal,string,startIndex,length)
:: extracts the substring from string starting at startIndex for the specified length
SET string=%2%
SET startIndex=%3%
SET length=%4%
if "%4" == "0" goto :noLength
CALL SET _substring=%%string:~%startIndex%,%length%%%
goto :substringResult
:noLength
CALL SET _substring=%%string:~%startIndex%%%
:substringResult
set "%~1=%_substring%"
GOTO :EOF
和一个字符串函数的长度:
:StrLength
::StrLength(retVal,string)
::returns the length of the string specified in %2 and stores it in %1
set #=%2%
set length=0
:stringLengthLoop
if defined # (set #=%#:~1%&set /A length += 1&goto stringLengthLoop)
::echo the string is %length% characters long!
set "%~1=%length%"
GOTO :EOF
所以我猜我在bat ...中错过了一个indexOf()函数。
答案 0 :(得分:3)
rem indexof result haystack needle
:indexof
setlocal enabledelayedexpansion enableextensions
set result=
set "haystack=%~2"
call :strlength length %3
call :strlength haylength %2
set /a max=haylength-length
for /l %%i in (0,1,%max%) do (
if "!haystack:~%%i,%length%!"=="%~3" (set result=%%i&goto indexofDone)
)
set result=-1
:indexofDone
endlocal && set %~1=%result%
goto :eof
也可用in my SVN。请注意,我更改了strLength
的定义以修复一些错误:
:strlength
setlocal enableextensions
set "#=%~2"
set length=0
:stringLengthLoop
if defined # (set "#=%#:~1%"&set /A length+=1&goto stringLengthLoop)
endlocal && set "%~1=%length%"
GOTO :EOF
进一步注意,所有这一切都无济于事,因为使用批处理文件解析XML不是你应该做的事情。