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?
Ich habe eine Textdatei (config.txt) mit folgenden Inhalt:
alpha = "Das ist der 1. Wert"
beta = "Das ist der 2. Wert"
gamma = "Das ist der 3. Wert"
Nun möchte ich mit meiner Batch-Datei (search.bat) nach dem Wort beta suchen, anschließend den Wert in den Anführungszeichen als Variable output speichern und am Ende mit echo %output% in der Batch-Datei ausgeben.
Wichtig anzumerken ist, dass das die Variable output (und damit auch die Ausgabe) ohne Anführungszeichen ist. Der Wert output entspricht demnach:
Das ist der 2. Wert
In der Batch-Datei sollen dabei folgende Bedingungen erfüllt werden:
1)
- Das zu suchende Wort soll mit der Variable target beschrieben werden.
- Außerdem soll der Pfad der Textdatei mit der Variable path beschrieben werden.
Am besten definiert man das ganz am Anfang.
set target=beta
set path="C:\Users\Timo\Documents\Wort-Suche mit BAT\config.txt"
2) Der Suchvorgang soll auch einwandfrei funktionieren...
- ... wenn in der Textdatei keine Leerzeichen um das Gleichheitszeichen sind.
- ... wenn in der Textdatei ganz viele Leerzeichen um das Gleichheitszeichen sind.
- ... wenn ganz am Anfang der Zeile ein oder mehrere Leerzeichen sind.
Außerdem
Beispiel:
alpha="Das ist der 1. Wert"
beta = "Das ist der 2. Wert"
gamma = "Das ist der 3. Wert"
Somit soll der Suchvorgang die Leerzeichen, die um das Gleichheitszeichen und vor den Variablen-Namen sind, komplett ignorieren.
Er soll sich nur anhand des Suchworts (beta) und den Anführungszeichen orientieren.
Ich habe mehrere Stunden versucht mein Problem selbständig zu lösen. Einige Forumsbeiträge schienen mir interessant, aber ich bin trotzdem zu keinem Ergebnis gekommen.
Hier sind die Links zu den beiden Beiträgen, die vermutlich bei der Lösung helfen.
Wie verwende ich ein "(Anführungszeichen) als FOR / F-Trennzeichen in CMD.exe unter Windows 7?
Vielen Dank für eure Hilfe
Timo
3 Antworten
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
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.
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:
PS:
Das Thema Variablen einlesen und Speichern habe ich hier schon zig mal exerziert. ua:
- https://www.gutefrage.net/frage/batch-bestimmte-stellen-in-datei-schreiben-und-lesen#answer-399281056
- https://www.gutefrage.net/frage/batch-datei-daten-auslesen#answer-391661574
@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!
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.