crocodyl
Goto Top

Batch String suchen in einer Textdatei und wenn gefunden diesen String + die nächsten 7 Zeichen in eine Variable speichern

Hallo und erfolgreiches neues Jahr an Alle hier,

Würde gerne per Batch aus eine Text-Datei einen String finden und dann die nächsten 7 Zeichen wissen wollen.
Hintergrund:
die Mozilla Firefox Datei prefs.js kopiere ich nach C:\ benenne um in prefs.txt
Da sind bestimmt viele Zeichen drinn, die so einfach nicht angefasst werden wollen.
jedenfalls kann ich mir mit

for /f "tokens=2 delims=/" %%a in ('findstr "Path" "%APPDATA%\Mozilla\Firefox\profiles.ini"') do set mozPfad=%APPDATA%\Mozilla\Firefox\profiles\%%a
echo %mozPfad%

findstr cld.bz/....... "%mozPfad%\prefs.js" >C:\prefsZeile.txt

schon mal die Zeile mit den Webseiten, die beim Start von Firefox in eine Datei prefsZeile.txt ausgeben lassen.

Das ist dann der Inhalt, eine superlange Zeile:
user_pref("browser.startup.homepage", "https://www.google.de/search?q=Google&ie=utf-8&oe=utf-8&client=firefox-b&gfe_rd=cr&ei=ZXtaWKODDsXc8AeS1oOoCg|http://autec-wheels.de:8080/webshop/login.action|https://www.bannerbatterien.com/de/Batteriesuche|https://c11.aufwind-solutions.de/window.phtml?e_pid=multipart|https://workshop.autodata-group.com/login?destination=vehicle/component/ ...|http://teileshop-berlin.dinnebiergruppe.de/Account/Login?ReturnUrl=%2F# ...|https://www.nuernberger-garanta.de/versicherungen/mobilitaetsgarantie/in ...|https://www.kupplung.de/anhaengerkupplung/anhaengerkupplungen/?cnid=527b ..)|https://cld.bz/EZHGout/150/|https://www.repdoc.com/WM/Login#Articles|https://www.partslink24.com/partslink24/user/login.do?redirectUrl=/parts ...|https://login.i.daimler.com/internet/login?brand=wp&TYPE=33554432&am ...$SM$1K5vbIO6Q9st1ZNW2wlDfunuGQNTOnjkxYu2KY8tkWi51IxOIl7gag2jXqDZV1MaPzaiXHHFR2xsjmHR2NqW3SxKQNhucPt%2b&TARGET=$SM$https%3a%2f%2faftersales%2ei%2edaimler%2ecom%2fmb-webparts%2f|https://www.tyre24.com/de/de/item/details/id/T279647//alcar//carManufact ...|https://www.kfz-betrieb.vogel.de/reifenfinder/|http://1055spreeradio.radio.de/|https://www.ks-partnersystem.de/;

jetzt suche ich nach dem cld.bz/ und wuerde gerne die naechsten 7 Zeichen wissen

um an einem anderen Arbeitsplatz dann diese neuen 7 Yeichen zu ersetzen.

sonst kann ich das nicht vollautomatisch machen,
dass diese 7 Zeichen spaeter ersetzt werden das funktioniert schon,
bisher muss ich diese 7 Zeichen selber in eine Textdatei eingeben.
Hatte gedacht, das bring ich schon hin, aber die anyahl der Tokens, wenn man die hier ueberhaupt bestimmen kann, muessen ja nicht gleich bleiben, wenn der Chef mal die Reihenfolge der Firefox/Start/Seiten vorne aendert.

Ja, ich koennts ueberleben, aber interessant waehre es schon.
Danke, wenns einer liest schonmal

Content-Key: 360160

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

Printed on: April 24, 2024 at 13:04 o'clock

Member: Pedant
Pedant Jan 06, 2018 at 20:42:06 (UTC)
Goto Top
Hallo Crocodyl,

Dir auch ein frohes Neues.

Zitat von @Crocodyl:
Das ist dann der Inhalt, eine superlange Zeile:
Schicker wäre diese Zeile:
user_pref("browser.startup.homepage", "about:blank");

Zitat von @Crocodyl:
Würde gerne per Batch aus eine Text-Datei einen String finden und dann die nächsten 7 Zeichen wissen wollen.
Die Batch- und PS-Experten könnten Dir sicher Deine Frage beantworten.
Ich kann Dir nur eine Lösung anbieten.
Ich mache sowas mit pedate.

pedate /fin C:\prefs.txt /str~ pos ~line cld.bz/ 1 /m=pos /if "number ~m=pos lss 0" /next : /calc "~m=pos + 7" /m=pos /str~ subl ~line ~m=pos 7 :  
Das spuckt EZHGout aus.
Damit wäre die Aufgabe gelöst oder soll der Wert weiter verarbeitet oder woanders eingebaut werden?

Die Schritte im Einzelnen kurz erklärt:
/fin - öffen die Textdatei, ließ die erste Zeile und speichert deren Inhalt in ~line
/str - Mach eine Stringoperation und zwar suche die 1. Position von cld.bz in ~line
/m=pos - Speicher den Positionswert in m=pos
/if - Mach einen numerischen Vergleich: ~m=pos kleiner 0
Falls ja:
- dann /next (gehe zurück zu /fin und lies die nächste Zeile in ~line ein
Falls Nein:
- /calc (addiere ~m=pos mit 7) (7 ist die Länge von "cld.bz/")
- Speicher das Ergebnis wieder in m=pos
- /str~ - Nehe den Teilstring aus ~line ab der Position ~m=pos und zwar 7 Zeichen
Es folgt keine weitere Anweisung, daher erfolgt die Ausgabe, was hier der Teilstring ist, also EZHGout

Gruß Frank
Member: rubberman
rubberman Jan 06, 2018 at 21:38:28 (UTC)
Goto Top
So etwas macht man (wegen fehlender Regex Unterstützung) nicht mit Batch. Wenns aber unbedingt sein muss, dann vielleicht so:
@echo off &setlocal
for /f "tokens=2 delims=/" %%a in ('findstr "Path" "%APPDATA%\Mozilla\Firefox\profiles.ini"') do set "mozPfad=%APPDATA%\Mozilla\Firefox\profiles\%%a"  
for /f "delims=" %%i in ('findstr /c:"https://cld.bz/" "%mozPfad%\prefs.js"') do set "prefsZeile=%%i"  

setlocal EnableDelayedExpansion
set "prefsZeile=!prefsZeile:"=^"!"  
set "prefsZeile=!prefsZeile:&=^&!"  
set "prefsZeile=!prefsZeile:|=^|!"  
set "i=0"  
set "sub[!i!]=%prefsZeile:https://cld.bz/=" & set /A i+=1 & set "sub[!i!]=%"  
set "sub=!sub[1]:~,7!"  
endlocal &set "sub=%sub%"  

echo %sub%
pause
Steffen
Mitglied: 135111
135111 Jan 07, 2018 updated at 09:30:26 (UTC)
Goto Top
gci "$env:APPDATA\Mozilla\Firefox\profiles\*\prefs.js" |?{(gc $_.Fullname) -match  'cld\.bz/([^/]+)'} | %{$matches[1]}  
Member: Crocodyl
Crocodyl Jan 07, 2018 at 23:28:05 (UTC)
Goto Top
Ich danke Euch vielmals,
jetzt habe ich die Auswahl und probiere das mal aus.
Schön daß es Gute gibt,
schön, daß ich nicht alleine bin.
Member: Pedant
Pedant Jan 08, 2018 at 16:15:44 (UTC)
Goto Top
Hallo Crocodyl,

Deinen Betrag habe ich heute etwas aufmerksamer gelesen und dabei fiel mir auf, dass Du die Aufgabenstellung an unterschiedlichen Stellen unterschiedlich formuliert hast:

a) Im Beitragstext heißt es:
Zitat von @Crocodyl:
Würde gerne per Batch aus eine Text-Datei einen String finden und dann die nächsten 7 Zeichen wissen wollen.

b) Im Beitragstitel heißt es:
Zitat von @Crocodyl:
String suchen in einer Textdatei und wenn gefunden diesen String + die nächsten 7 Zeichen in eine Variable speichern

Zunächst hatte ich nur die Aufgabenstellung im Beitragstext gesehen und beachtet, also die 7 Zeichen nach dem Suchstring ermittelt.
Laut Beitragstitel suchst Du aber den String und zusätzlich die darauf folgenden 7 Zeichen.
Okay, der Unterschied ist nicht groß, aber vorhanden und sicher auch entscheidend.

Was gemäß dem Beitragstitel zusätzlich zur Aufgabenstellung gehört, ist das Ablegen des Suchergebnisses in einer Variablen.
Ich habe mein Skript jetzt so umgeschrieben, dass es alternativ beide Varianten ermöglicht und das Ergebnis (falls vorhanden) in der Variablen %DieZeichen% speichert.
Desweiteren habe ich noch geändert, dass zunächst die Zeile, die mit «user_pref("browser.startup.homepage",» beginnt gesucht wird und dann nur in dieser Zeile der eigentliche Suchstring gesucht wird.
Im meiner ersten Version wurde der Suchstring irgendwo in der Datei gesucht, was durchaus falsche Treffer ermöglicht.
Dazu kommt die erwähnte Fallunterscheidung und etwas mehr an Grundgerüst.

@echo off

set suchstr=cld.bz/
set inklusive=nein
REM set inklusive=ja
set zeichenanzahl=7
set zeilenbeginn=user_pref(\"browser.startup.homepage\",  
set suchdatei=prefs.js

echo Gesucht wird die Datei %suchdatei%

set PrefsPfad=
for /f %%f in ('dir /ad /b %APPDATA%\Mozilla\Firefox\Profiles') do set PrefsPfad=%APPDATA%\Mozilla\Firefox\Profiles\%%f  
if "%PrefsPfad%"=="" (  
  echo Der Profilpfad konnte nicht ermittelt werden.
  exit /b 1
)
if not exist "%PrefsPfad%"\ (  
  echo Eine %suchdatei% wurde nicht gefunden.
  echo Gesucht wurde sie in %PrefsPfad%
  exit /b 2
)

set za-output=
if "%inklusive%"=="ja" (  
  echo Gesucht werden "%suchstr%" und die darauf folgenden %zeichenanzahl% Zeichen  
  echo und zwar in der Zeile, die mit "%zeilenbeginn%" beginnt  
  echo in der Datei "%PrefsPfad%"\%suchdatei%  
  pedate /fin %PrefsPfad%\%suchdatei% /str~ pos ~line %zeilenbeginn% 1 /m=pos1 /if "number ~m=pos1 neq 0" /next : /str~ pos ~line %suchstr% 1 /m=pos2 /str len %suchstr% /m=len /calc "~m=len + %zeichenanzahl%" /m=len /str~ subl ~line ~m=pos2 ~m=len /m=erg : /if "number ~m=pos2 lss 0" /clear : ~m=erg : /v  
) else (
  echo Gesucht werden die %zeichenanzahl% Zeichen, die auf "%suchstr%" folgen  
  echo und zwar in der Zeile, die mit "%zeilenbeginn%" beginnt  
  echo in der Datei "%PrefsPfad%"\%suchdatei%  
  pedate /fin %PrefsPfad%\%suchdatei% /str~ pos ~line %zeilenbeginn% 1 /m=pos1 /if "number ~m=pos1 neq 0" /next : /str~ pos ~line %suchstr% 1 /m=pos2 /str len %suchstr% /m=len /calc "~m=pos2 + ~m=len" /m=pos3 /str~ subl ~line ~m=pos3 %zeichenanzahl% /m=erg : /if "number ~m=pos2 lss 0" /clear : ~m=erg : /v  
)

call zavars.cmd
del zavars.cmd
echo(

if not defined za-output (
  echo Die gesuchte Zeichenfolge konnte nicht gefunden oder ermittelt werden.
  exit /b 3
)

set DieZeichen=%za-output%
echo Gefunden wurde: %DieZeichen%


Zitat von @Crocodyl:
...die Mozilla Firefox Datei prefs.js kopiere ich nach C:\ benenne um in prefs.txt
Da sind bestimmt viele Zeichen drinn, die so einfach nicht angefasst werden wollen.
Das Kopieren kannst Du Dir sparen, denn solange Du nur lesend auf die Datei zugreifst, musst Du Dir keine Sorgen machen, dass Du sie kaputt machst.

Zitat von @Crocodyl:
jetzt suche ich nach dem cld.bz/ und wuerde gerne die naechsten 7 Zeichen wissen

um an einem anderen Arbeitsplatz dann diese neuen 7 Yeichen zu ersetzen.

sonst kann ich das nicht vollautomatisch machen,
dass diese 7 Zeichen spaeter ersetzt werden das funktioniert schon,
bisher muss ich diese 7 Zeichen selber in eine Textdatei eingeben.
Hä?
Was möchtest Du mit diesen zerrissenen Sätzen sagen, insbesordere: was funktioniert schon?

Falls Du weiter Automatisieren möchtest, also das Suchergebnis in die prefs.js eines anderen Rechners automatisch einfügen lassen möchtest, ergeben sich dabei durchaus Schwiegigkeiten.
Das eigentliche Ersetzten könnte man leicht mit pedate erledigen.
Ich wüsste aber nicht, wie man beim Zugriff auf einen anderen Rechner über's Netzwerk (\\Rechner\C$) den dort gültigen %APPDATA%-Pfad ermittelt, um die richtige prefs.js zu finden und möglicherweise würde es an den gegebenen Rechten scheitern, die "fremde" Datei von der Ferne aus zu ändern.
Man könnte aber beispielsweise die Aufgabe zweiteilen und getrennt auf Quell- und Ziel-Rechner das gewünschte Skript ausführen:
- Ein erstes Skript liest den Wert aus der lokalen prefs.js und legt ihn in einer Datei im Netzwerk ab.
- Ein zweites Skript liest den Wert aus der Datei im Netzwerk und aktualisiert damit die lokale prefs.js entsprechend.

Gruß Frank
Member: Crocodyl
Crocodyl Jan 09, 2018 at 16:42:21 (UTC)
Goto Top
Supi, danke, ist bestimmt auch mal für andere sehr hilfreich, das Ding zu wissen.
Ich war schon mit den nachfolgenden 7 Zeichen voll zufrieden.
Bei den PC-Start´s läuft die Batch je nach %username% ab,
dann haben die User am nächsten Morgen die reneuerte Webseite an genau der gleichen Tab-Stelle.

Das ersetzen hab ich mit der zweiten im Web gefundenen Batch gemacht.
Die erste konnte ich irgendwie nicht aus einer Batch heraus aufrufen, die ließ sich nur in der Konsole starten, hat aber sonst funktioniert.
Die 2. hat funktioniert aus Batch heraus zu starten. War aber glaube ich eine .exe. strings.exe
Wie hießen die noch gleich, ich sitze gerade nicht an dem Arbeitsplatz.
die erste hieß replace.bat

die zweite heist jrepl.bat

bis denne
Member: Pedant
Pedant Jan 09, 2018 at 21:25:09 (UTC)
Goto Top
Hallo Crocodyl,

Zitat von @Crocodyl:
Supi, danke, ist bestimmt auch mal für andere sehr hilfreich, das Ding zu wissen.
Nur aus Neugier: Hast Du eine der drei hier angebotenen Lösungen genommen?

Zitat von @Crocodyl:
Bei den PC-Starts läuft die Batch je nach %username% ab,
dann haben die User am nächsten Morgen die erneuerte Webseite an genau der gleichen Tab-Stelle.
Sei Dir gewahr, dass der Name bei %USERNAME% und bei %APPDATA% nicht zwangsläufig identisch ist.
1. Beispiel:
username=Administrator
appdate=C:\Users\Administrator.000\AppData\Roaming
2. Beispiel:
username=Sabine.Leutheusser-Schnarrenberger
appdate=C:\Users\Sabine.Leutheusser\AppData\Roaming

Zitat von @Crocodyl:
Das Ersetzen hab ich mit der zweiten im Web gefundenen Batch gemacht.
Die Erste konnte ich irgendwie nicht aus einer Batch heraus aufrufen, die ließ sich nur in der Konsole starten, hat aber ansonsten funktioniert.
Etwas, das sich nicht per Batch starten lässt gibt es eher nicht, vermutlich hast Du nur was falsch gemacht.
Da es auch eine Batch war, hättest Du sie vermutlich per call replace.bat und noch Parameter aufrufen müssen.

Da es jetzt läuft, könntest Du den Beitrag auf "gelöst" setzen.

Gruß Frank
Member: Crocodyl
Crocodyl Jan 09, 2018 at 23:52:00 (UTC)
Goto Top
Hallo Pedant,
bin erst morgen wieder da wo es laufen soll, Rom wurde auch nicht an einem Tag abgebrannt, oder so.
Aber ich berichte, und bin gewiss, daß Ihr die Guten seid.
Danke für die neue Erkenntnis, daß %username% auch schief gehen kann, werde ich mir merken.
Man, wenn ich mir eines Tages alles gemerkt habe, muss ich sterben und kann keinem mehr nützlich sein.
Meine Usernamen sind 3-Stellig und werden vorher einmal als endungslose Datei imOrdner Users angelegt, so daß das lokale und das Servergespeichete Profil eindeutig erkennbar ist, hoofe ich zumindest aus dem Schneider zu sein, vorsichtig ausgedrückt.

Mit dem falsch machen, das mache ich heimlich immer wieder, aber nach außen versuche ich immer alles richtig zu machen.

Gruß & Gute Nacht ihr Kracks