Wie kann man mit Batch aus einer Textdatei ein Wort suchen und ein 2. Wort, was in der gleichen Zeile in Anführungszeichen steht, als Variable definieren?

3 Antworten

ein guter Rat:

Batch ist ab Windows 11 ein Auslaufmodell. cmd fliegt als Windowsconsole in absehbarer Zeit raus (wird nur aus Kompatibilität weiter unterstützt). Für die neue Console wird Powerschell zur Standardsprache. Investiere nicht mehr allzuviel Energie in das erlernen von Batch!

...und eine eindringliche Warnung!
Außerdem soll der Pfad der Textdatei mit der Variable  path beschrieben werden.

path ist eine Systemvariable, welche die Standardzugriffspfade für Befehle und Programme regelt! Setze nie die Variable path , wenn Du die Standardzugriffspfade nicht explizit ändern willst!

In der Art wie Du sie verwenden möchtest, geht dir der Zugriff auf die externen Systembefehle und andere Programme verloren!

Verwende nicht die Endung .bat für Windowsbatch. die richtige Extension ist .cmd ! Mit der Endung .bat zwingst Du den Batchinterpreter in einen MSDOS-Kompatibilitätsmodus, welcher ein fehlerhaftes Errormangmet von MSDOS erzwingt.

demo1.cmd

@echo off
chcp 65001 >nul
 rem %UserProfile% zeigt immer auf Dein aktuelles Arbeitprofil. Wichtig! setze die "Gänsefüßchen" um den gesamten set-Term und nicht um den zuzuweisenden Inhalt! so:
set "ConfigFile=%UserProfile%\Documents\Wort-Suche mit BAT\config.txt"  
set "Target=beta"
 rem lies aus der in %ConfigFile% definierten Datei nur die Zeile, welche den Begriff "beta" enthält in die Batchvariable %Result%
 rem trenne Zeilen an "=" und " " als Delimiter in Token 1 und den Rest
 rem skip=2 überspringt 2 Headerzeilen der Ausgabe von Find
for /f "skip=2 tokens=1* delims== " %%a in ('find /i "%Target%" "%ConfigFile%"') do (
   rem weise den in tokens=1* definierten Rest* der Variable. Token 1 in der Laufvariable %%a ist das Wort vor dem "=" ,%%~b ist der Rest ...wird als Variableninhalt zugewiesen die Tilde~ entfernt eventuelle "Quotes" um den Inhalt der Laufvariable %%b.
  set "Result=%%~b"
   rem zur Demo mal anzeigen
  echo die Variable: Result=%%~b
)
set "Output=%result%"
echo %Output%
pause

Da es Dir wohl weniger um die Suche geht, als den Inhalt einer/mehrerer Variable zuzuweisen, wäre die einfachste Vorgehensweise einfach den Inhalt von Configtext in Variablen "umzuwandeln"

demo2.cmd

@echo off
chcp 65001 >nul
 rem %UserProfile% zeigt immer  auf Dein aktuelles Arbeitprofil
set "ConfigFile=%uUserProfile%\Documents\Wort-Suche mit BAT\config.txt"  
 rem lies alle "Variablen" aus der in %ConfigFile% definierten Datei in echte Batchvariablen
 rem dito
for /f "usebackq tokens=1* delims== " %%a in ("%ConfigFile%") do (
  rem weise alle Zeilen der Configdatei Variablen zu. Token 1 in der Laufvariable %%a ist der Variablenname ,dito
 set "%%a=%%~b"
  rem zur Demo mal anzeigen
 echo die Variable: %%a=%%~b
)

set "Output=%beta%"
echo %Output%
echo %gamma%
pause

"Quotes" kann man auch mit der Stringreplace-funktion von set entfernen:

demo3.cmd

@echo off
chcp 65001 >nul

set TestVar="text mit Gänsefüßchen"
echo so sihts  am anfang aus: %testvar%
  rem entferne jegliche "Quotes" nachträglich
set TestVar=%TestVar:"=%
echo so danach: %testvar%
pause
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Das Endziel wäre interessant. Wozu brauchst Du das? Manchmal macht man sich zu viel Arbeit mit Werkzeugen, die nicht so leicht zu nutzen oder auch völlig ungeeignet sind.

Eventuell lässt sich das mit Regex oder AutoIt einfach lösen.

Mit Regex würde das hier:

(beta = ")(.*)"

die beiden Elemente in den Klammern finden; Du müsstest dann nur das zweite Element mit

$2

abrufen. Das ist dann Dein gesuchter String:

Das ist der 2. Wert

Mit Autoit kann man auch die jeweiligen Dateien ziehen, bearbeiten und ausgeben; Du müsstest nicht mit unterschiedlichen Batchdateien arbeitet.

EchterTimo 
Fragesteller
 13.01.2022, 13:05

Mir geht es grundlegend darum mehrere String Variablen in einer Textdatei zu speichern und abrufen zu können. Aber die sollen halt auch Sätze sein können.

0
sumpfbub  13.01.2022, 17:08
@EchterTimo

Das mächtigste Werkzeug zum Suchen von Zeichenfolgen ist wohl RegEx. Du kannst so irrsinnig viel damit anstellen, dass es eine wahre Pracht ist. Allerdings erschließt sich das nicht auf Anhieb. Eine sehr gute Einführung findest Du hier:

https://danielfett.de/2006/03/20/regulaere-ausdruecke-tutorial/

Es ist auch möglich, Zeichenfolgen durch andere zu ersetzen; das typische Suchen und Ersetzen lässt sich hier deutlich vielfältiger verwenden.

Auch kannst Du mal einen Ausflug zu Auto Hot Key unternehmen, damit kannst Du wie auch mit AutoIt relativ einfach vieles automatisieren und Hilfe für beide gibt es in gutbesuchten Foren:

https://ahkde.github.io/docs/AutoHotkey.htm

0

PS:

Das Thema Variablen einlesen und Speichern habe ich hier schon zig mal exerziert. ua:

@echo off
chcp 65001 >nul
 rem variablen, welche gespeichert und gelesen werden sollen
set "__@.alfa=Das ist der 1. Wert"
set "__@.beta=Das ist der 2. Wert"
set "__@.gamma=Das ist der 3. Wert"
set "__@.blah=blub"

set "myFile=test2.ini"
 rem schreibe alle variablen welche mit __@. beginnen in Datei nur eine Zeile nötig!
set "__@." >"%myFile%"
echo das wurde gespeichert:
type "%myFile%"
echo:

 rem lösche alle Variablen welche mit __@. beginnen
for /f "tokens=1 delims==" %%a in ('set "__@."') do (set "%%a=")
 rem mal schauen ob sie weg sind...
set "__@."

 rem lies alle Variablen aus Datei wieder ein...
for /f "usebackq tokens=*" %%a in ("%myFile%") do (set "%%a")
 rem mal schauen ob sie wieder da sind sind...
set "__@."

set "__@.beta=aus die Maus"
set "__@.gama=irged was anderes als vorher"

 rem und wieder Speichern
set "__@." >"%myFile%"
echo das wurde gespeichert:
type "%myFile%"
echo:
pause

Damit umgehst Du Leerzeichen am Anfang einer Zeile oder um die Gleichheitszeichen. die Variablen werden so gespeichert wie sie sind. (und auch wieder eingelesen).

Das ganze Gewusel mit Find oder dem entfernen von Leerzeichen entfällt.

Zudem ist das Schreiben mit set und das Einlesen unempfindlich gegen Sonderzeichen im String!

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren