91183
Goto Top

Letztes Wort der aktuellsten Datei als Variable setzen

Hallo,

ich habe irgendwie ein Problem mit diesem Teil meines Skriptes. Habe auch schon die Suchfunktion
benutz und dies bezüglich eine ganze Sammlung an guten Treffern bekommen aber heute scheint nicht mein Tag
zu sein, da ich in diesem Punkt einfach nicht weiter komme.


Also, der Teil des Skriptes soll folgendes machen:

1. Die aktuellste Datei mit dem Namen "Idee" in einem bestimmten Ordner suchen
(Beispiel zu diesem Fall: "Idee_20110207_162351.txt")

2. Aus dieser .txt-Datei ausschließlich das letzte Wort in der letzten Zeile als Variable setzen.

3. Die Variable überprüfen und bei einem bestimmten Wort zu einem anderen Punkt im Script springen.
(Beispiel: wenn
%var% = "start"
dann
goto Part-2)

4. Die aktuellste Datei nach einer Minute erneut prüfen, falls %var% ≠ start
(Dateien werden zwar mehrfach pro Minute aktualisiert aber so reicht das).


Punkt 3 und 4 sollten jetzt nicht das Problem darstellen aber da ich heute anscheinend eh nicht so gut drauf bin. . . face-smile


Danke schon mal für Eure Hilfe.

Content-ID: 160239

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

Ausgedruckt am: 25.11.2024 um 00:11 Uhr

bastla
bastla 07.02.2011 um 07:40:04 Uhr
Goto Top
Hallo Xeno--!

Die neueste Datei findest Du (je nachdem, ob Du auf den Namen abstellen willst oder tatsächlich auf das Änderungsdatum) mit einem "dir /b /on" oder "dir /b /od" und kannst sie aus einer "for /f"-Schleife heraus einer Variablen zuweisen.

Danach kannst Du dann mit einer weiteren "for /f"-Schleife die letzte Zeile auslesen (falls es ein Erkennungskriterium gäbe, schneller über "findstr") und schließlich aus dieser Variablen per "gewöhnlicher" "for"-Schleife das letzte Wort - als Demo des letzten Schrittes etwa:
@echo off & setlocal
set "Zeile=Aus dieser .txt-Datei ausschließlich das letzte Wort in der letzten Zeile als Variable setzen."  
for %%i in (%Zeile%) do set "Letztes=%%i"  
echo %Letztes%
[Edit] Nachtrag: Wenn es überhaupt nur darum geht, dieses letzte Wort für eine Abfrage zu nutzen, kann der letzte Teil auch so aussehen:
echo %Zeile%|findstr /i /e /c:" start">nul && echo Letztes Wort ist "start" || echo Letztes Wort ist nicht "start"
Vorausgesetzt wurde dabei, dass es vor dem letzten Wort ein Leerzeichen gibt (es also nicht die gesamte letzte Zeile bildet) ...
[/Edit]

Grüße
bastla
pieh-ejdsch
pieh-ejdsch 07.02.2011 um 13:15:52 Uhr
Goto Top
moin Xeno,

das letzte Wort kannst Du mithilfe dieses Schnipsels aus einer Datei rausholen:
steht dann in Variable Lastsigns
:: Übergibt in die Variable lastsigns das letzte Wort der Als Parameter 1 übergebenen Datei
@echo off&setlocal disabledelayedexpansion
(
echo @echo off
echo echo."%%Zeile: =!LF!%%"  
)>"%temp%\LZ2LF.cmd"  
setlocal enabledelayedexpansion
:CreateLF
set LF=^


rem ** The two empty lines are neccessary, spaces are not allowed
setlocal disabledelayedexpansion
for /f "usebackq tokens=*" %%i in ("%~1") do for /f %%j in ("%%~i") do set "Zeile=%%i"  
endlocal&set "Zeile=%Zeile:!=$#³#²#$%"  
for /f %%j in ('"%temp%\LZ2LF.cmd"') do for /f %%k in ("%%~j") do set "lastSigns=%%k"  
endlocal&set "lastSigns=%lastSigns:$#³#²#$=!%"  
endlocal&set "lastsigns=%lastsigns%  

[Edit] einen fix für die Ausrufezeichen eingefügt [/Edit]
[Edit2] einen Fix für Zeilen mit Tab/ Leerzeichen eingefügt [/Edit]
Gruß Phil
bastla
bastla 07.02.2011 um 15:36:38 Uhr
Goto Top
... und für etwas kniffligere Fälle (enthaltene Sonderzeichen, letztes Wort = gesamter Inhalt der letzten Zeile) könnte die Ermittlung des letzten Wortes der Datei "%NeuesteDatei%" etwa so aussehen:
set G=%temp%\GetLastWord.vbs
> %G% echo T=RTrim(Replace(CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0)).ReadAll,vbCrLf," "))  
>>%G% echo WScript.Echo Mid(T,InStrRev(T," ")+1)  
for /f "delims=" %%i in ('cscript //nologo %G% "%NeuesteDatei%"') do set "Letztes=%%i"  
Grüße
bastla
pieh-ejdsch
pieh-ejdsch 07.02.2011 um 16:01:34 Uhr
Goto Top
moin bastla,

wie ist das gemeint mit: letztes Wort = gesamter Inhalt der letzten Zeile

ist das ein Wort ohne LeerZeichen oder wie ist das zu verstehen?

nur Interessehalber!

Gruß Phil
bastla
bastla 07.02.2011 um 16:06:03 Uhr
Goto Top
Hallo PH!

Ja, nur für den Fall, dass in der letzten Zeile nur ein einziges Wort (bzw kein einziges Leerzeichen) steht (entweder daran oder an der mangelnden Genauigkeit - falls ich das Leerzeichen im Suchbegriff wegließe und das gesuchte Wort das Ende eines längeren Wortes bildete - würde mein "findstr"-Ansatz von oben scheitern) ...

Wenn übrigens Xeno-- etwas mehr Info zur Textdatei zu bieten gehabt hätte, wären solche Überlegungen vermutlich überflüssig gewesen.

Grüße
bastla
pieh-ejdsch
pieh-ejdsch 07.02.2011 um 16:28:26 Uhr
Goto Top
danke für den Hinweis.
ja das mit Leerzeichen Zeilen /Tab Zeilen habe ich grad auch noch gefixt.

da gehts bei Dir aber noch in die Grütze.

mal sehen wann sich Xeno meldet.

Gruß Phil
jeb-the-batcher
jeb-the-batcher 07.02.2011 um 22:00:55 Uhr
Goto Top
Hallo,

jetzt noch die Batch Variante die mit Sonderzeichen &<>... und auch mit ! funktioniert und ohne temporäre Datei auskommt.

@echo off
setlocal DisableDelayedExpansion
rem ** Linefeed erzeugen
set LF=^


rem ** Zwei leere Zeile erforderlich
rem ** Letzte Zeile rausholen
for /f "usebackq tokens=*" %%i in ("%~1") do for /f %%j in ("%%~i") do set "Zeile=%%i"  

rem ** In Zeile die Spaces durch Linefeed ersetzen
setlocal EnableDelayedExpansion
for %%a in ("!LF!") do set "zeile=!zeile: =%%~a!"  

set "last="  
for /f "delims=" %%j in ("!Zeile!") do (   
	if not defined last endlocal
	set "last=%%j"  
)
setlocal Enabledelayedexpansion
echo LAST="!last!"  

Grüße
jeb
91183
91183 07.02.2011 um 22:26:01 Uhr
Goto Top
Hallo Leute.

Schuldigung wegen der dürftigen Informationen über die .txt-Datei. Diese ist eine
Log-Datei eines anderen Programms. In dieser werden alle Eingaben des
lokalen Benutzers, sowie Ausgaben des Programms gespeichert.
Also alle Eingaben in die Kommandozeile, das Chatfenster, usw. eben.

Sieht dann ungefähr so aus:

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

  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 ] Programm > Text3

Nur mal so als Beispiel. face-smile


Allerdings habe ich da noch ein paar Fragen / Probleme:


1. @bastla

[...] Danach kannst Du dann mit einer weiteren "for /f"-Schleife die letzte Zeile auslesen [...]

Genau das bekomme ich nicht hin bzw. komme ich durcheinander.
Kannst Du eventuell mal bitte ein Beispiel posten?


2. Kommt es hinteher zu Problemen, da das andere Programm hinter die letzte Textzeile
noch eine leere Zeile setzt? Im Beispiel Zeile 14 und 15.


3. Gibt es eine Möglichkeit das letzte Wort zusammen mit seinen Sonderzeichen zu
erfassen und als Variable zu setzten? Sprich, wenn das letzte Wort "$$$start" ist, dass
das System dann die Variable %var% auch mit "$$$start" gleich setzt und NICHT nur das
Wort "start" nimmt.

P. S.: @bastla:

[...] [Edit] Nachtrag: Wenn es überhaupt nur darum geht, dieses letzte Wort für eine Abfrage zu nutzen, kann der letzte Teil
auch so aussehen: [...]

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.



4. Könnt Ihr mir bitte mal erklären, warum die Batch mir im folgenden Skript die
Datei mit dem neusten Datum im Dateinamen ausgibt, obwohl
"dir /b /on" gesetzt ist?

@echo off & setlocal

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

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

echo %NeuesteDatei%

Beispiel wären mal die Dateien:

Idee_20110206_184933
idee_20110206_221259

Mit diesem Skript wirft er mir die Datei "idee_20110206_221259" obwohl der Befehl
"dir" die Option "/on" hat, welche ja eigentlich alphabetisch sortiert. Demnach
müsste er doch eigentlich die die Datei "Idee_20110206_184933" auswerfen. Warum
tut er das nicht?

Ich meine, es ist schon super, dass er mir mit diesem Skript die richtige Datei ausspuckt
aber ich würde doch gerne wissen, warum das so ist.


So, genug geschrieben. Hoffentlich bringe ich Euch mit Punkt 4 nicht durcheinander. face-smile
91183
91183 07.02.2011 um 22:43:32 Uhr
Goto Top
@ jeb

Sorry, während Du Deinen Teil gepostet hast, war ich wohl gerade am schreiben.
Deswegen habe ich das übersehen und die Frage mit reingeschrieben. face-smile
bastla
bastla 07.02.2011 um 22:44:15 Uhr
Goto Top
Hallo Xeno--!

Für das gepostete Beispiel sollte
@echo off & setlocal
set "pfad=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 "usebackq delims=" %%i in ("%NeuesteDatei%") do set "Zeile=%%i"  
setlocal enabledelayedexpansion
for %%i in (!Zeile!) do set "Letztes=%%i"  
endlocal & set "Letztes=%Letztes%"  
popd

echo %Letztes%
genügen (wenn nur am Ende der vorletzen Zeile eine Zeilenschaltung steht, die letzte Zeile aber leer ist) ...

Das letzte Wort wird (in dieser Fassung) als der Teil der Zeile nach dem letzten Leerzeichen, Komma, Semikolon, Tab interpretiert - wenn es daher nur um "$" als Sonderzeichen geht, ist das kein Problem ...
Zur Sortierung: Da "2" nach "1" kommt, wird auch "221259" nach "184933" einsortiert (der Teil davor ist ja jeweils gleich) - der letzte aufgelilstete Dateiname bleibt in der Variablen %NeuesteDatei% (die vorhergehenden werden jeweils durch die nachfolgenden überschrieben), daher ist das Ergebnis die lt Dateiname neueste Datei.
Wenn es mehrere Wörter zu unterscheiden gibt, ist natürlich "findstr" nicht das geeignete Werkzeug ...

Grüße
bastla
91183
91183 07.02.2011 um 22:52:13 Uhr
Goto Top
Hallo bastla.

Danke für Deine Erklärung und das Beispiel.
Werde das gleich mal testen.


Gruß Xeno
91183
91183 07.02.2011 um 23:27:22 Uhr
Goto Top
@ bastla

Funktioniert so leider nicht.

Fehlermeldung:
Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch.
Die Datei "" kann nicht gefunden werden.
ECHO ist ausgeschaltet (OFF)

Kann es sein, dass das Problem in Zeile 2 liegt, ...
set "pfad=set pfad=%userprofile%\eigene dateien\logs\"
weil der set-Befehl doppelt ist?


Oder in Zeile 5.
for /f "delims=" %%i in ('dir /b /on "Idee*.txt" 2^>nul') do set "NeuesteDatei=%%i"
Genauer gesagt sieht es so aus, als würde der Pfad (%pfad%) vor "Idee*.txt" fehlen.


Ist das richtig? Kann das daran liegen?

Gruß Xeno
bastla
bastla 07.02.2011 um 23:35:17 Uhr
Goto Top
Hallo Xeno--!

Natürlich ist die Zeile 2 falsch face-sad - richtig wäre:
set "pfad=%userprofile%\eigene dateien\logs\"
In Zeile 5 ist (wegen der Zeile 4) die Pfadangabe nicht mehr erforderlich.

Grüße
bastla
91183
91183 07.02.2011 um 23:48:51 Uhr
Goto Top
Ok, er findet jetzt zwar den Pfad aber irgendetwas haut noch nicht hin.


Bekomme jetzt nur die Aussage ...

ECHO ist ausgeschaltet (OFF)

... anstatt des Wortes.
bastla
bastla 07.02.2011 um 23:58:15 Uhr
Goto Top
Hallo Xeno--!

Das deutet dann darauf hin, dass die letzte Zeile doch nicht ganz leer ist ...

Soferne nur Leerzeichen enthalten wären, könntest Du es mit folgender Zeile 6 versuchen:
for /f "delims=" %%i in ('findstr /v /x " *" "%NeuesteDatei%"') do set "Zeile=%%i"
[Edit] Besser so:
for /f "usebackq delims=" %%i in ("%NeuesteDatei%") do for /f %%a in ("%%i") do set "Zeile=%%i"
[/Edit]

Grüße
bastla
91183
91183 08.02.2011 um 00:21:05 Uhr
Goto Top
Es sieht so aus, als würde er jetzt zumindest die Zeile finden,
denn er gibt bei...

echo %Letztes%

...ein kleinen weißes Quadrat aus. Ungefähr so "■" nur eben weiß.


Habe dann mal getestet, ob die anderen Variable etwas ausspucken.
Also:

echo %NeuesteDatei%
echo %Zeile%
echo %Letztes%

Ergebnis:

NeuesteDatei -> war mit "Idee_20110206_221259" erfolgreich.
Zeile -> nur das weiße "■"
Letztes -> nur das weiße "■"


[Edit]

Habe das Deiner Änderung (Edit) angepasst.
Jetzt bekomme ich folgende Ergebnisse:

NeuesteDatei -> war mit "Idee_20110206_221259" erfolgreich.
Zeile -> ECHO ist ausgeschaltet (OFF)
Letztes -> ECHO ist ausgeschaltet (OFF)

[/Edit]
bastla
bastla 08.02.2011 um 00:30:11 Uhr
Goto Top
Hallo Xeno--!

Meine Vorschläge waren ja nur für den Fall gedacht, dass die letzte Zeile nur Leerzeichen enthielte ...
Könntest Du mit einem Hexeditor (zB Tiny Hexer) mal nachsehen, was sich tatsächlich in der letzten Zeile befindet?

Grüße
bastla
91183
91183 08.02.2011 um 00:40:40 Uhr
Goto Top
Die letzte Zeile scheint nicht mal ein Leerzeichen zu haben.
Vielleicht erzeugt das andere Programm einfach nur einen Absatz.
Ungefähr so, als würde der normale User einfach nur mal auf "Enter" drücken.

Aber ich schau mal kurz mit dem Hex-Editor nach.
91183
91183 08.02.2011 um 01:06:45 Uhr
Goto Top
Also, habe jetzt mal den Hex-Editor befragt und er gibt mir folgendes aus:


5c23e3b2b1675b404df28322f2d01e46


Bezieht sich auf die Datei von oben.
Also diese hier:

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

  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 ] Programm > Text3

Hoffe das hilft.
bastla
bastla 08.02.2011 um 01:14:15 Uhr
Goto Top
Hallo Xeno--!

Dann variieren wir die Zeile 6 noch mal:
for /f "delims=" %%i in ('type "%NeuesteDatei%"') do set "Zeile=%%i"
Mit einem "type" erfolgt eine automatische Konvertierung einer Unicode-Datei.

Grüße
bastla
rubberman
rubberman 08.02.2011 um 01:18:37 Uhr
Goto Top
Hallo Xeno--

das ist UNICODE. TYPE sollte damit umgehen können.
Ggf. sollte diese Zeile 6 funktionieren.
for /f "delims=" %%i in ('type "%NeuesteDatei%"') do for /f %%a in ("%%i") do set "Zeile=%%i"  

Grüße
rubberman

<edit TOO LATE face-wink \>
91183
91183 08.02.2011 um 01:23:09 Uhr
Goto Top
91183
91183 08.02.2011 um 01:25:15 Uhr
Goto Top
Alles klar. Jetzt funktioniert es, super!!! face-smile

Ganz großes DANKE (!!!) an Euch
und vor allem an Dich bastla.

Sorry, dass Ich Euch so viel Arbeit gemacht habe.


Gruß Xeno