2016-06-24 5 views
1

Ich habe eine Linie in xml:Substring in einer Batch-Datei

<P4PORT>facebook.com</P4PORT> 

Wie man den Wert (facebook.com) in dem letzten <P4PORT> Tag bekommen. Früher habe ich wie folgt aus:

for /f "tokens=1" %%R in ('findstr /c:"<P4Port>" file.xml') do echo %%R 
PAUSE 

Aber es gab mir ganze Reihe <P4PORT>facebook.com</P4PORT>. Bitte sagen Sie, wie dies mit Batch-Datei erreicht werden kann.

+1

vielleicht haben Sie eine Vbscript erstellen möchten der den XML (XPATH) nach dem gewünschten Wert abfragt und ausdruckt. Aus der Back-Datei können Sie dies wieder mit Ihrer for() -Schleife lesen – AcidJunkie

+0

Probieren Sie 'for/f'-Token = 2 delims = <>" %% R in ('Findstr/L/I/C: "" "Datei .xml "') setze" LAST = %% R "', danach 'echo (% LAST%' (vorausgesetzt es gibt keine führenden Leerzeichen in der Textzeile) ... – aschipfl

Antwort

0

Mit RegExp mit einem vbscript:

strData = "<P4PORT>facebook.com</P4PORT>" 
With New RegExp 
    .IgnoreCase = True 
    .Pattern = "<P4PORT>((.|\n)*?)</P4PORT>" 
    Set Matches = .Execute(strData) 
End With 
If Matches.Count > 0 Then strText = Matches(0).SubMatches(0) 
wscript.echo strText 
0

Es ist immer besser, XML oder andere strukturierte Daten als hierarchisches Objekt zu analysieren, anstatt als komplizierter Text zu hacken und kratzen. So sind Sie nicht auf die Formatierung der Daten angewiesen, egal ob es sich um Verschönerung, Minimierung oder was auch immer handelt. Einfachste Lösung wäre dies in Ihrem Batch-Skript zu setzen:

for /f "delims=" %%I in (
    'powershell "([xml](gc filename.xml)).SelectSingleNode('//P4PORT/text()').data"' 
) do set "P4PORT=%%I" 

echo %P4PORT% 

Wenn Sie Geschwindigkeit über Einfachheit schätzen, können Sie JScript auch aufrufen, die XML zu analysieren. Speichern Sie dieses Batch + JScript-Hybridskript mit der Erweiterung .bat.

@if (@CodeSection == @Batch) @then 
@echo off & setlocal 

for /f "delims=" %%I in (
    'cscript /nologo /e:JScript "%~f0" "filename.xml"' 
) do set "P4PORT=%%I" 

echo %P4PORT% 

goto :EOF 
@end // end Batch/begin JScript hybrid code 

var xml = WSH.CreateObject('MSXML2.DOMDocument.6.0'); 
xml.load(WSH.Arguments(0)); 
WSH.Echo(xml.selectSingleNode('//P4PORT/text()').data); 
0

Dieses Ding funktionierte für mich und ist auch eine einfache Lösung. Aber danke für deine Antworten.

für/f "tokens = 3 delims => <" %% a in ('TYPE% Connection%^| FIND ""') stelle P4PORT = %% ein