ichcodegerne
Goto Top

Bachtdatei: Textdatei nach String durchsuchen und Zeile unter String in Variable speichern

Hallo zusammen,
habe vermutlich folgendes (vermutlich zimlich simpel aber ich komme nicht drauf) Problem:

ich habe eine Textdatei die folgendermaßen aufgebaut ist:

HalliiHallooo
Wie gehts den so
gesuchterString
123456789
mir geht es sehr gut
und selbst


ich möchte also nach dem String "gesuchterString" in der Datei suchen und die Zeile darunter(die Zahlenfolge: "123456789") in einer Variable abspeichern.


Vielleicht kann mir ja einer helfen, danke im voraus.


Grüße...

Content-Key: 487155

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

Ausgedruckt am: 29.03.2024 um 13:03 Uhr

Mitglied: 140777
140777 21.08.2019 aktualisiert um 12:33:57 Uhr
Goto Top
Für sowas einfaches nimmt man heute eigentlich gleich die Powershell.
$variable = Select-String -Path 'D:\test.txt' -Pattern "gesuchterString" -SimpleMatch -Context 1 | select -Expand Context | select -Expand PostContext  
$variable
Wenn man unbedingt will kann man Powershell auch in einer Batch verwenden
@echo off
chcp 1252
set "datei=D:\test.txt"  
for /f "delims=" %%a in ('powershell -Executionpolicy Bypass -NoP -C "Select-String -Path '%datei%' -Pattern 'gesuchterString' -SimpleMatch -Context 1 | select -Expand Context | select -Expand PostContext"') do set "variable=%%a"  
echo %variable%
Plain Batch geht auch, aber mal ehrlich wer macht sowas damit heute noch?
@echo off &setlocal
chcp 1252
set "datei=D:\test.txt"  
set "found="  
for /f "usebackq delims=" %%a in ("%datei%") DO (  
	if not defined found (
		echo %%a|findstr /ilc:"gesuchterString" >nul 2>&1 && (set found=1)  
	) else (
		set "variable=%%a"  
		goto next
	)
)
:next
echo %variable%
Mitglied: NetzwerkDude
NetzwerkDude 21.08.2019 um 11:58:45 Uhr
Goto Top
Powershell:
$text = Get-Content .\test.txt; $variable = $text[$text.IndexOf("gesuchterString")+1]  
$variable
Mitglied: ichcodegerne
ichcodegerne 21.08.2019 um 12:16:09 Uhr
Goto Top
Hallo,
danke für die Antwort.
leider bekomme ich zum Schluss keine Ausgabe bei dem "echo %variable%"

habe mir eine Dateierstellt (Test.cmd) und den Code eins zu eins von dir übernommen

Bitte nochmals um hilfe, danke
Mitglied: 140777
140777 21.08.2019 aktualisiert um 12:32:06 Uhr
Goto Top
Welche Variante??
Und wie sieht die Textdatei in wirklichkeit aus? Suchworte mit Umlauten? Vielleicht Textdatei UTF oder Unicode kodiert? In dem Fall nutze gleich die Powershell-Varianten.
Mitglied: 77559
77559 22.08.2019 um 20:52:46 Uhr
Goto Top
Moin moin,
Zitat von @140777:

Für sowas einfaches nimmt man heute eigentlich gleich die Powershell.
> $variable = Select-String -Path 'D:\test.txt' -Pattern "gesuchterString" -SimpleMatch -Context 1 | select -Expand Context | select -Expand PostContext  
> $variable
> 

Mit der richtigen Reihenfolge brauchen die Parameter keine Namen,
an Stelle von mehrfachen Select-Object -ExpandProperty kann man den . Property dereference operator nutzen

Mit Hilfe von Aliasen und möglichen Abkürzungen geht dann dies (auch wenn's kryptisch aussieht:kann ja gewünscht sein)

$Variable=(sls 'gesuchterstring' .\test.txt -Sim -Cont 1).Context.PostContext  
Mitglied: 140777
140777 22.08.2019 aktualisiert um 22:52:30 Uhr
Goto Top
Mit der richtigen Reihenfolge brauchen die Parameter keine Namen,
Nur versteht dann ein Anfänger nicht mehr die Bohne. Gut wenn man's in seinen eigenen Skripten nutzt OK nur wenn man das ganze öffentlich postet sollte man doch bitte immer die ausführliche Variante bevorzugen, nicht umsonst wird das immer wieder gepredigt.
Ein Skript das man Monate später wieder anpackt und dann in einer eher Variante vorfindet was vielleicht auch jemand anderes erst mal "entschlüsseln" muss, trägt auch nicht gerade zu einer effektiven Zusammenarbeit bei.

an Stelle von mehrfachen Select-Object -ExpandProperty kann man den . Property dereference operator nutzen
Jupp kann man, ist aber bei diversen Befehlen keine gute Idee und läuft gerne mal auf Fehler wenn die Klammer kein passendes Ergebnis sondern null liefert, dann beschwert sich die Shell natürlich darüber daß null keine Eigenschaften hat, was bei der Pipevariante kein Problem ist da einfach kein Objekt über die Pipe wandert.

Was cool aussieht muss nicht unbedingt immer vorteilhaft sein.

Hat alles seine Vor- und Nachteile (•‿•), aber darum ist die Powershell ja so beliebt, jeder wählt seine passende Variante. Nur öffentlich doch bitte für den Laien entzifferbar sonst trägt das nur zum Frust der Anfänger bei.