2010-12-10 14 views
0

J'ai cherché des routines de manipulation de chaînes, et je suis conscient que je pourrais le faire dans plusieurs autres langues, mais je voudrais dans un fichier batch pour plus de simplicité. Je souhaite qu'il recherche une balise dans un fichier XML et extrait tout de là à la fin du fichier.Script Batch pour extraire une chaîne d'un fichier

Donc je suppose, par exemple dans le pseudo-javascript:

marketIndex = str.indexOf("<Markets>"); 
length = str.length; 
marketString = str.substring(markeIndex, length-1); 
return str; 

J'ai une fonction de sous-chaîne chauve-souris:

: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 

et une longueur d'une fonction de chaîne:

: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 

donc je suppose qu'il me manque une fonction indexOf() dans la chau ...

+0

Ce ne serait pas aussi simple que l'extrait JS, s'il était écrit en chauve-souris. – user502515

+0

oui, je constate que ... –

+0

Ma recommandation personnelle est: vous prendrez moins de temps à écrire quelque chose dans, diable, même C (!), Que dans le pseudo-langage de lot. –

Répondre

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 

Également disponible in my SVN. Notez que j'ai modifié la définition de strLength pour corriger quelques bugs:

: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 

On notera en outre, que tout cela ne vous aidera pas du tout comme l'analyse syntaxique XML avec des fichiers de traitement par lots n'est pas quelque chose que vous devriez faire.

+2

+1 parce que c'est un morceau d'intelligence indéchiffrable. –

+1

@Camilo: Quoi? Illisible? C'est probablement l'un des morceaux les plus lisibles du code de lot que j'ai écrit :-). Je suis d'accord, cependant, que 'strLength' n'est pas aussi clair qu'il pourrait l'être, mais cela vient directement du PO. – Joey

+0

Brilliant Joey :) Test demain, mais ça a l'air génial. –

Questions connexes