91183
Goto Top

Text nach einem Schlüsselwort als Variable setzen

Hallo!

Ich bin es schon wieder. face-smile


Diese Frage bezieht sich auf eine andere Frage / einen anderen Beitrag von mir.
Ich bin allerdings der Meinung, dass diese Frage / dieses Problem einen
eigenen Beitrag verdient, da sie / es doch leicht abweicht und andere Ergebnisse liefern soll.

Letztes Wort der aktuellsten Datei als Variable setzen


Ich würde gerne wissen, was ich an dem folgenden Skript abändern muss,
damit dieses nicht mehr das letzte Wort in der letzten Zeile als Variable setzt,
sondern stattdessen in der letzten Zeile der Datei nach einem Schlüsselwort sucht
(Beispiel: "$$$start") und alle Wörter und Leerzeichen die danach folgen als Variable übernimmt.
Einzige Ausnahme hierbei müsste das Leerzeichen nach dem Schlüsselwort sein.


Erstmal das zu ändernde Skript (noch mal DANKE an bastla):

@echo off & setlocal
set "pfad=%userprofile%\eigene dateien\logs\"  

pushd "%pfad%"  
for /f "delims=" %%i in ('dir /b /on "Idee*.txt" 2^>nul') do set "NeuesteDatei=%%i"  
for /f "delims=" %%i in ('type "%NeuesteDatei%"') do set "Zeile=%%i"  
setlocal enabledelayedexpansion
for %%i in (!Zeile!) do set "Letztes=%%i"  
endlocal & set "Letztes=%Letztes%"  
popd

echo %Letztes%


Ich schätze mal, es müsste nur Zeile 8 geändert werden. Aber ich habe keine Ahnung in was. face-smile


Auszulesende Datei als Beispiel: "Idee_20110206_221259"

---------------------------------------------------------------

  Kanal ID:      (('id', 1884537),)  
  Kanal Name:    Kanal246
  Benutzername:       Username
  Gestartet am / um: 2011.02.06 22:12:59
---------------------------------------------------------------

[ 2011.02.06 22:14:19 ] Programm > Text1
[ 2011.02.06 22:15:06 ] Programm > Text2
[ 2011.02.06 22:15:11 ] User > U-Text1
[ 2011.02.06 22:15:15 ] User > $$$start chkdsk C: /F



Ablauf (quasi fast genau wie bei dem anderen Beitrag)

Batch-Datei sucht sich die letzte Beschriebene Zeile (hier Zeile 14) und überprüft diese nach dem Wort "$$$start".
Sofern dieses vorhanden ist, werden alle Wörter und Zeichen (Ausnahme: das Leerzeichen nach dem Schlüsselwort)
nach "$$$start" als Variable gesetzt. Also sollte die Variable (%var%) in diesem Beispiel so aussehen: "%var%=chkdsl C: /F"


Danke im Voraus und entschuldigt bitte, dass ich Euch schon wieder Arbeit mache. face-smile
Gruß Xeno

Content-Key: 160334

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

Printed on: April 25, 2024 at 12:04 o'clock

Member: bastla
bastla Feb 08, 2011 at 07:27:17 (UTC)
Goto Top
Hallo Xeno--!

Versuch es ab Zeile 7 so :
set "Such=$$$start"  
echo "%Zeile%"|findstr "%Such%">nul || goto :NichtVorhanden  
setlocal enabledelayedexpansion
set "var=!Zeile:*%Such% =!"  
endlocal & set "var=%var%"  
popd

echo %var%
Für den Fall, dass es den Suchstring nicht in der letzten Zeile gibt, musst Du noch die Zeile 2 Deinen Bedürfnissen anpassen ...

Grüße
bastla

P.S.:
... entschuldigt bitte, dass ich Euch schon wieder Arbeit mache. face-smile
Wir suchen doch richtiggehend danach ... face-wink
Mitglied: 91183
91183 Feb 08, 2011 at 22:14:05 (UTC)
Goto Top
Jop, hat geklappt. face-smile

Das "goto :NichtVorhanden" habe ich schon gleich beim schreiben geändert. face-big-smile

Danke!!!



Wo es mir gerade noch einfällt.

Gibt es die Möglichkeit mit einem ähnlichen Befehl eine Config-Datei auszulesen und die Zeilen zu vergleichen?
Dieser Teil bezieht sich auch wieder auf die vorherige Frage:

Und zwar wird ja mit diesem Skript das letzte Wort in der (vor)letzten Zeile der aktuellsten Datei gesucht
(Skript A):


@echo off & setlocal
set "pfad=%userprofile%\eigene dateien\logs\"  

pushd "%pfad%"  
for /f "delims=" %%i in ('dir /b /on "Idee*.txt" 2^>nul') do set "NeuesteDatei=%%i"  
for /f "delims=" %%i in ('type "%NeuesteDatei%"') do set "Zeile=%%i"  
setlocal enabledelayedexpansion
for %%i in (!Zeile!) do set "Letztes=%%i"  
endlocal & set "Letztes=%Letztes%"  
popd

echo %Letztes%


... und ich hatte im anderen Beitrag geschrieben, dass das letzte Wort (die Variable %Letztes%)
erst später verglichen werden soll:


Das Wort (egal welches) soll nur als Variable gesetzt
werden, damit es hinterher verglichen werden kann. Beispiel:

Letztes Wort (if %var%=) "$$$Internet", . . . (goto) Firefox starten
Letztes Wort (if %var%=) "$$$E-Mail", . . . (goto) ist wohl klar
Letztes Wort (if %var%=) "$$$Explorer" . . . (goto) auch klar
usw.

Nur wenn das Wort abweicht soll er zum Anfang (goto Anfang) zurückkehren und eben alles noch einmal machen. Bis irgendwann
vielleicht mal ein Wort auftaucht das passt.
Aber das nur so am Rande.


Also habe ich hinterher angefangen die if-Befehle einzubauen, um das Wort zu vergleichen.
Hier mal ein Beispiel (Skript B):


if %Letztes%==$$$fire goto Firefox
if %Letztes%==$$$vlc goto VLC
if %Letztes%==$$$abi goto AbiWord
if %Letztes%==$$$auda goto Audacity
if %Letztes%==$$$clam goto Clamwin
if %Letztes%==$$$file goto FileZilla
if %Letztes%==$$$7 goto 7-Zip
if %Letztes%==$$$deep goto DeepBurner
goto END

:Firefox_A
echo Firefox starten
start FirefoxPortable\FirefoxPortable.exe

:VLC
::....
::....
::....
::usw. eben.


Jetzt habe ich mich gefragt, ob man das nicht auch einfacher über eine Config-Datei (Name: Idee_config.txt)
vergleichen könnte. Diese würde dann ungefähr so aussehen (Skript C):


Pfad			%userprofile%\eigene dateien\logs\
Datei			Idee*

------------------------------------------------------------------

$$$fire			start FirefoxPortable\FirefoxPortable.exe
$$$vlc			start Z:\VLCPalyer\VLC.exe
$$$abi			abi\abiword.exe
$$$irgendwas		..........
$$$irgendwas2		..........
$$$chk			chkdsk C: /F
$$$copy			copy Ordner-A\Text.txt Ordner-B\Text.txt
$$$dir			cd "ein Ordner" & dir  

usw.


(In diesem Beispiel bezieht sich Zeile 1 auf Skript A, Zeile 2)
(Zeile 2 aus Skript C bezieht sich auf Skript A, Zeile 5)
(Getrennt werden die Spalten A und B im Skript C durch mehrere Tab-Abstände, falls das wichtig sein sollte)


Ablauf wäre dann folgender:

Der if-Befehl vergleicht die Variable %Letztes% mit den Wörtern in der ersten Spalte der Config-Datei (Skript C)...
Ausnahme wären natürlich die Wörter "Pfad" und "Datei". Wobei es wahrscheinlich einfacher wäre,
nur die Wörter aus ersten Spalte zu berücksichtigen, die mit $$$ anfangen und diese dann mit %Letztes% zu vergleichen.
... und sofern eines der Wörter mit %Letztes% übereinstimmt, wird der Befehl ausgeführt der in der zweiten Spalte steht.


Als Beispiel bezogen auf Skript C:

if %Letztes% == %$$$Wort_aus_Spalte_1% dann führe %Befehl_aus_Spalte_2% aus.

... wäre dann:

if %Letzes% == "$$$chk" dann führe "chkdsk C: /F" aus

Nur so als Beispiel. Ist natürlich kein korrekter Befehl. face-smile


Ach so, Skript A müsste so abgeändert werden, dass es in Zeile 2...

set "pfad=%userprofile%\eigene dateien\logs\"  

...nach dem Wort "Pfad" in der ersten Spalte der Config-Datei (Skript C) sucht und dann den Pfad aus Spalte 2 übernimmt.


Das Gleiche gilt natürlich auch für die 5te Zeile von Skript A.

for /f "delims=" %%i in ('dir /b /on "Idee*.txt" 2^>nul') do set "NeuesteDatei=%%i"  

Diese müsste dann nach dem Wort "Datei" suchen . . . . . usw.


So . . . wieder einen halben Roman geschrieben. face-smile

Danke im Voraus
Gruß Xeno
Member: bastla
bastla Feb 08, 2011 at 22:26:05 (UTC)
Goto Top
Hallo Xeno--!

Das Auslesen würde ich jeweils mit "findstr" erledigen - also zB:
set "Conf=D:\Idee_config.txt"  
for /f "tokens=1*" %%i in ('findstr /b "Pfad" "%Conf%"') do set "Pfad=%%j"  
Etwas kontrollierter wäre:
set "Conf=D:\Idee_config.txt"  
set "Pfad="  
for /f "tokens=1*" %%i in ('findstr /b "Pfad" "%Conf%"') do set "Pfad=%%j"  
if not defined Pfad echo Pfad nicht gefunden & goto :ConfigFehler
Nach dem selben Schema:
for /f "tokens=1*" %%i in ('findstr /b /L "%LetztesWort%" "%Conf%"') do %%j
oder
set "Aktion="  
for /f "tokens=1*" %%i in ('findstr /b /L "%LetztesWort%" "%Conf%"') do set "Aktion=%%j"  
if not defined Aktion ...
%Aktion%
[Edit] Das "Sicherheits-/L" (damit "$" auf keinen Fall als Zeilenende-Kennzeichen interpretiert wird, braucht's wohl nicht - wenn's ja eh vorneweg steht) ... [/Edit]

Grüße
bastla

P.S.: Deine "Romane" lese ich gerne face-smile - insbesondere im Vergleich zu vielen anderen "Problemstellungen" hier, bei denen nach der dritten Nachfrage noch immer mehr im Nebel als bereits erkennbar ist ...
Mitglied: 91183
91183 Feb 09, 2011 at 00:02:53 (UTC)
Goto Top
Hallo.


Danke und DANKE. face-smile

Morgen werde ich das mal ausprobieren. Gebe Dir dann eine Rückmeldung.

Bis dann.


Gruß Xeno
Mitglied: 91183
91183 Feb 09, 2011 at 01:46:42 (UTC)
Goto Top
Hallo.

Ich konnte jetzt doch nicht umhin das Skript einmal zu testen.
Habe es aber noch nicht in die richtige .bat eingebaut sondern die Teile
einfach nur mal in einer neuen Batch getestet.


Also, der erste Teil mit dem erkennen des Pfades / Datei...

set "Conf=D:\Idee_config.txt"  
set "Pfad="  
for /f "tokens=1*" %%i in ('findstr /b "Pfad" "%Conf%"') do set "Pfad=%%j"  
if not defined Pfad echo Pfad nicht gefunden & goto :ConfigFehler

...hat super funktioniert.


Allerdings habe ich mit dem zweiten Teil...

set "Aktion="  
for /f "tokens=1*" %%i in ('findstr /b /L "%LetztesWort%" "%Conf%"') do set "Aktion=%%j"  
if not defined Aktion echo Aktion nicht gefunden & goto :ConfigFehler
%Aktion%

... ein kleines Problem. Wie hier (zwischen den beiden Trennstrichen) schon erwähnt ...

Der if-Befehl vergleicht die Variable %Letztes% mit den Wörtern in der ersten Spalte der Config-Datei (Skript C)...
Ausnahme wären natürlich die Wörter "Pfad" und "Datei". Wobei es wahrscheinlich einfacher
wäre,
nur die Wörter aus ersten Spalte zu berücksichtigen, die mit $$$ anfangen und diese dann mit %Letztes% zu vergleichen.
... und sofern eines der Wörter mit %Letztes% übereinstimmt, wird der Befehl ausgeführt der in der zweiten Spalte
steht.

...soll das Skript (zum vergleichen des letzten Wortes) NICHT
"%userprofile%\eigene dateien\logs\" bzw. "Idee*" als Aktion setzen,
wenn die Variable (%Letzte%) gleich "Pfad" bzw. "Datei" ist. Gut, dass würde in
dieser Beispiels-Config-Datei...


Pfad			%userprofile%\eigene dateien\logs\
Datei			Idee*

------------------------------------------------------------------

$$$fire			start FirefoxPortable\FirefoxPortable.exe
$$$vlc			start Z:\VLCPalyer\VLC.exe
$$$abi			abi\abiword.exe
$$$irgendwas		..........
$$$irgendwas2		..........
$$$chk			chkdsk C: /F
$$$copy			copy Ordner-A\Text.txt Ordner-B\Text.txt
$$$dir			cd "ein Ordner" & dir  

usw.


nicht viel ausmachen aber in anderen Dateien vielleicht schon.
Deswegen habe ich den zweiten Teil Deines Skripts so abgeändert....


@echo off & setlocal

set "Config=Idee_config.txt"  
set "Letztes=$$$fire"  

set "Aktion="  
for /f "tokens=1*" %%i in ('findstr /b /L "§%Letztes%" "%Config%"') do set "Aktion=%%j"  
if not defined Aktion echo Nicht gefunden & pause & exit


echo %Aktion%


pause
(Zeile 4 nur um die Suche nach dem letzten Wort zu simulieren)
(Änderung in Zeile 7)


... und die Config-Datei so:


Pfad			%userprofile%\eigene dateien\logs\
Datei			Idee*

------------------------------------------------------------------

§$$$fire			start FirefoxPortable\FirefoxPortable.exe
§$$$vlc			start Z:\VLCPalyer\VLC.exe
§$$$abi			abi\abiword.exe
§$$$irgendwas		..........
§$$$irgendwas2		..........
§$$$chk			chkdsk C: /F
§$$$copy			copy Ordner-A\Text.txt Ordner-B\Text.txt
§$$$dir			cd "ein Ordner" & dir  

usw.


Dadurch sucht das Skript nur noch nach Wörter mit einem § davor. Sprich, wenn
in diesem Fall "§%Letztes%==Pfad" bzw. Datei", würde er nicht mehr
"%userprofile%\eigene dateien\logs\" bzw. "Idee*" auswerfen, da er ja in der
Config-Datei nach dem Wort "§Pfad" suchen würde. Es dieses da aber nicht gibt.


Ist die einzige Methode, die mir auf die Schnelle eingefallen ist.
Schätze mal, Du kennst eine bessere Lösung.


Gruß Xeno
Member: bastla
bastla Feb 09, 2011 at 07:13:51 (UTC)
Goto Top
Hallo Xeno--!

Kannst Du so machen ...

Alternative: Da ja die drei "$" als Kennzeichen dienen können, einfach vorweg danach filtern:
for /f "tokens=1*" %%i in ('findstr /b /L "$$$" "%Config%"^|findstr /b "%Letztes%"') do set "Aktion=%%j"
Der Übersichtlichkeit halber könntest Du natürlich auch für "$$$" eine Variable verwenden.

Grüße
bastla

P.S.: "exit" ist für mich nur zusammen mit einem "/b" sinnvoll - ansonsten tut's eigentlich auch ein "goto :eof" (und das schließt mir beim Testen das CMD-Fenster nicht face-wink)