alme123
Goto Top

In Datei zwischen A und C unbekannten String (mit Leerstellen) in Variable abspeichern per Batch

Hallo zusammen.

Ich suche nach längerer Zeit nach einem Batchscript (VBS ist auch OK) dass aus einer Datei
zwischen "A" und "C" einen unbekannten String mit Leerstellen in Variable abspeichert.

BeispielDateiinhalt:
AB BC

Ich möchte "B B" in der Variable stehen haben, was noch nicht funktioniert hat.

Weiß vlt. einer eine Lösung?

Danke im Vorraus.

Alme123

Content-ID: 189580

Url: https://administrator.de/contentid/189580

Ausgedruckt am: 22.11.2024 um 21:11 Uhr

bastla
bastla 14.08.2012 aktualisiert um 12:55:54 Uhr
Goto Top
Hallo Alme123!

Unter der Annahme, dass der gesuchte Teilstring sich nicht über mehrere Zeilen erstreckt:
@echo off & setlocal
set "Ein=D:\DeineDatei.txt"  
set "Nach=A"  
set "Vor=C"  

set "G=%temp%\GetSubString.vbs"  
>"%G%" echo Set a=WScript.Arguments:Set rE=New RegExp:rE.Pattern=a(1)^&"(.+)"^&a(2):For Each M In rE.Execute(a(0)):WScript.Echo M.SubMatches(0):Next  

for /f "delims=" %%i in ('findstr /rc:"%Nach%.*%Vor%" "%Ein%"') do set "Zeile=%%i"  
if not defined Zeile echo Keine Daten gefunden! & goto :eof
for /f "delims=" %%i in ('cscript //nologo "%G%" "%Zeile%" "%Nach%" "%Vor%"') do set "Var=%%i"  
echo "%Var%"  
Grüße
bastla
Darkprodukt
Darkprodukt 14.08.2012 aktualisiert um 13:08:29 Uhr
Goto Top
Hallo,

Es gibt aber bei "AA BC" oder "AB CC" probleme.
Im ersten und zweiten fall ist die Ausgabe nur noch "B"
Fals das aber nie der fall ist solte es so gehen.
@echo off & setlocal enabledelayedexpansion
for /f "usebackq delims=C" %%i in ("Test.txt") do set "string=%%i" ^  
						  &set "string=!string:*A=!"  

Grüße
Darkprodukt
bastla
bastla 14.08.2012 um 13:06:28 Uhr
Goto Top
@Darkprodukt
Wozu die zweizeilige Schreibweise? Eigentlich sollte es doch
for /f "usebackq delims=C" %%i in ("Test.txt") do set "string=%%i" & set "string=!string:A=!"
auch tun ...

Einschränkung bei Deinem Vorschlag: "C" darf nicht schon vor dem gesuchten Teilstring enthalten sein und muss aus einem einzelnen Zeichen bestehen ...

Grüße
bastla
Alme123
Alme123 14.08.2012 um 13:08:52 Uhr
Goto Top
Hallo zusammen,

erstmal danke für die schnellen Antworten.

Bastla:
Dein 1. Beitrag ist FAST perfekt für mich.

Das Problem:
Es gibt mehrere solcher Strings in verschiedenen Zeilen.
Kann man es so machen, dass ALLE Strings ausgelesen werden in verschiedene Variabeln?

Darkprodukt:
Das funktioniert nicht so, wie ich es mir vorgestellt hatte.

Alme123
Darkprodukt
Darkprodukt 14.08.2012 aktualisiert um 13:14:27 Uhr
Goto Top
@bastla

Ja der einzeiler tuts auch.

Über den Nachteil bin ich mir Bewust, aber wenn ers anders gewölt hätte.
Hätte er ja auch als Beispiel, was anderes angeben können.

Wie z.b.
EF 14 C6 F8 A2 BC 93 F6
AF 8C 72 43 E9 8B C7 A2

Edit: Achja wenn ichs mir recht überlege geh ich davon aus das es sich um eine Hexadezimal geschriebene Datei Handelt, oder?

Grüße
Darkprodukt
Alme123
Alme123 14.08.2012 aktualisiert um 13:19:56 Uhr
Goto Top
@Darkprodukt

Nein, es ist eine HTML Datei.
Mit dem Script sollen alle Strings (<p>String</p>) ausgelesen werden.

Beispiel der HTML Datei:

<p>Unbekannter String1</p>
<p>Unbekannter String2</p>
<p>Unbekannter String3</p>

Alme123
Darkprodukt
Darkprodukt 14.08.2012 aktualisiert um 13:52:39 Uhr
Goto Top
Hallo,

Mal schauen was sich da machen lässt.
@echo off & setlocal enabledelayedexpansion
type >temp.txt
type >Strings.txt

for /f "usebackq delims=" %%i in ("Test.txt") do set "string=%%i" ^  
						 &set "string=!string:*A=!" ^  
                                                 &echo/!string!>>temp.txt

set "Zeile=0"  
:Scan
for /f "usebackq delims=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" %%i in ('more +!Zeile! Temp.txt') do (  
set "Ziffer=%%i"  
if !Ziffer!==C set "schalter=1"  
if not defined schalter set "Var=!Var!!Ziffer!"  
if defined schalter (
                     echo/!Var!>>Strings.txt
                     set /a "Zeile=!Zeile!+1"  
                     goto Scan
                     )
)

del temp.txt
Noch ungetestet

Die ganzen Strings werden jezt in eine datei geschrieben und nicht in eine Variable, da man sonst Arrys breuchte.

[Edit]: Ergenzung

Grüße
Darkprodukt
Alme123
Alme123 14.08.2012 um 13:32:43 Uhr
Goto Top
@Darkprodukt

Sytnaxfehler ;(
Darkprodukt
Darkprodukt 14.08.2012 aktualisiert um 13:40:54 Uhr
Goto Top
@Alme123
Ja 2 Syntaxfehler am Anfang ist Normal das kommt vom erstellen der beiden dateien "type >Datei.txt"

Grüße
Darkprodukt
Alme123
Alme123 14.08.2012 um 13:40:34 Uhr
Goto Top
@Darkprodukt
Geht nicht (Windows 7)
Darkprodukt
Darkprodukt 14.08.2012 um 13:42:32 Uhr
Goto Top
@Alme123

Geht schon.
Die Datei wird erstellt. Leider wird trotzdem Syntaxfehler ausgegeben.
Hab auch Windows 7

Grüße
Darkprodukt
Alme123
Alme123 14.08.2012 um 13:54:32 Uhr
Goto Top
Hallo zusammen,

bastla´s script funktioniert einwandfrei.
Danke an beide!

Alme123

[Theard closed]
bastla
bastla 14.08.2012 um 14:44:51 Uhr
Goto Top
@Darkprodukt
Ja 2 Syntaxfehler am Anfang ist Normal das kommt vom erstellen der beiden dateien "type >Datei.txt"
Du könntest es aber auch einfach richtig machen face-wink:
type nul>Datei.txt
Grüße
bastla
Alme123
Alme123 14.08.2012 aktualisiert um 18:24:50 Uhr
Goto Top
@alle

Es funktioniert doch nicht so, wie es soll.
Also:
Aus einer HTML Datei sollen ALLE Strings zwischen <p> und </p> ausgelesen und in einer VARIABLE abgespeichert werden.

Beispiel einer HTML Datei:

<html>
<head>
<p>Blabla</p>
<p>BloBlo</p>
</html>

Danke im Vorraus.

Alme123

[Theard unclosed]
bastla
bastla 14.08.2012 um 18:20:29 Uhr
Goto Top
Hallo Alme123!

Wozu verschiedene Variablen?

Wenn Du von Anfang an erklärt hättest, was Du eigentlich willst, wären wir schon ein Stück weiter ...

Grüße
bastla
Alme123
Alme123 14.08.2012 um 18:24:18 Uhr
Goto Top
Hi bastla,

Ja, stuldigung.
Eine Variable wär doch besser...
Also:
Aus einer HTML Datei sollen ALLE Strings zwischen <p> und </p> ausgelesen und in einer VARIABLE abgespeichert werden.

So?

Alme123
bastla
bastla 14.08.2012 um 18:26:59 Uhr
Goto Top
Hallo Alme123!
So?
Nein - am besten wird jeder einzelne String gleich verarbeitet - schematisch:
@echo off & setlocal
set "Ein=D:\DeineDatei.html"  
set "Nach=<p>"  
set "Vor=</p>"  

set "G=%temp%\GetSubString.vbs"  
>"%G%" echo Set a=WScript.Arguments:Set rE=New RegExp:rE.Global=True:rE.Pattern=a(1)^&"(.+)"^&a(2):For Each M In rE.Execute(CreateObject("Scripting.FileSystemObject").OpenTextFile(a(0)).ReadAll):WScript.Echo M.SubMatches(0):Next  

for /f "delims=" %%i in ('cscript //nologo "%G%" "%Ein%" "%Nach%" "%Vor%"') do (  
    echo Verarbeite "%%i"  
)
Grüße
bastla
Alme123
Alme123 14.08.2012 um 18:45:26 Uhr
Goto Top
Hi bastla,

FAST genaus so,
Ein Problem noch:

Wenn die HTML Datei etwas so aussieht:

<p>
Bla
Bla
</p>

Findet er nichts

Gibt es vlt. eine Lösung?

Danke

Alme123
bastla
bastla 14.08.2012 aktualisiert um 19:21:34 Uhr
Goto Top
Hallo Alme123!
Gibt es vlt. eine Lösung?
Eventuell - aber die wird Dir in Batch nicht wirklich nützen, da Batch nur zeilenorientiert verarbeitet - die Zeilenumbrüche würden dann zu einem "Zerlegen" der Teilstrings führen ...

[Edit] ... was sich vermeiden ließe, wenn vorweg die Zeilenumbrüche entfernt würden - etwa:
@echo off & setlocal
set "Ein=D:\DeineDatei.html"  
set "Nach=<p>"  
set "Vor=</p>"  

set "G=%temp%\GetSubString.vbs"  
 >"%G%" echo Set a=WScript.Arguments:Set rE=New RegExp:rE.Global=True:rE.Pattern=a(1)^&"(.+)"^&a(2)  
>>"%G%" echo T=CreateObject("Scripting.FileSystemObject").OpenTextFile(a(0)).ReadAll:T=Replace(T,vbNewLine,""):T=Replace(T,a(2),a(2)^&vbNewLine)  
>>"%G%" echo For Each M In rE.Execute(T):WScript.Echo M.SubMatches(0):Next  

for /f "delims=" %%i in ('cscript //nologo "%G%" "%Ein%" "%Nach%" "%Vor%"') do (  
    echo Verarbeite "%%i"  
)
[/Edit]

Grüße
bastla
Alme123
Alme123 14.08.2012 um 20:32:23 Uhr
Goto Top
Hi bastla,

Danke das funktioniert sehr gut.

Eine Frage noch (schon wieder? xD):
Wie kann ich es machen, dass alle %%i in %allezeilen% geschrieben wird?
Wenn ich
set allezeilen=%%i
eingebe
kommt der letzte String raus.

Danke.

Alme123
bastla
bastla 14.08.2012 um 21:24:42 Uhr
Goto Top
Hallo Alme123!

Wenn die einzelnen Werte (ohne Trennzeichen, ein solches hast Du ja nicht genannt, und natürlich ohne Zeilenumbrüche - siehe oben) in die Variable "%allezeilen%" sollen (wozu auch immer), dann würde ich einfach das VBScript entsprechend anpassen:
@echo off & setlocal
set "Ein=D:\DeineDatei.html"  
set "Nach=<p>"  
set "Vor=</p>"  

set "G=%temp%\GetSubString.vbs"  
 >"%G%" echo Set a=WScript.Arguments:Set rE=New RegExp:rE.Global=True:rE.Pattern=a(1)^&"(.+)"^&a(2)  
>>"%G%" echo T=CreateObject("Scripting.FileSystemObject").OpenTextFile(a(0)).ReadAll:T=Replace(T,vbNewLine,""):T=Replace(T,a(2),a(2)^&vbNewLine)  
>>"%G%" echo For Each M In rE.Execute(T):E=E^&M.SubMatches(0):Next:WScript.Echo E  

for /f "delims=" %%i in ('cscript //nologo "%G%" "%Ein%" "%Nach%" "%Vor%"') do set "allzeilen=%%i"  
Grüße
bastla