Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Letztes Wort der aktuellsten Datei als Variable setzen

Frage Entwicklung Batch & Shell

Mitglied: 91183

91183 (Level 1)

07.02.2011, aktualisiert 08.02.2011, 4679 Aufrufe, 23 Kommentare

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. . .


Danke schon mal für Eure Hilfe.
Mitglied: bastla
07.02.2011 um 07:40 Uhr
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:
01.
@echo off & setlocal 
02.
set "Zeile=Aus dieser .txt-Datei ausschließlich das letzte Wort in der letzten Zeile als Variable setzen." 
03.
for %%i in (%Zeile%) do set "Letztes=%%i" 
04.
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
Bitte warten ..
Mitglied: pieh-ejdsch
07.02.2011 um 13:15 Uhr
moin Xeno,

das letzte Wort kannst Du mithilfe dieses Schnipsels aus einer Datei rausholen:
steht dann in Variable Lastsigns
01.
:: Übergibt in die Variable lastsigns das letzte Wort der Als Parameter 1 übergebenen Datei 
02.
@echo off&setlocal disabledelayedexpansion 
03.
04.
echo @echo off 
05.
echo echo."%%Zeile: =!LF!%%" 
06.
)>"%temp%\LZ2LF.cmd" 
07.
setlocal enabledelayedexpansion 
08.
:CreateLF 
09.
set LF=^ 
10.
 
11.
 
12.
rem ** The two empty lines are neccessary, spaces are not allowed 
13.
setlocal disabledelayedexpansion 
14.
for /f "usebackq tokens=*" %%i in ("%~1") do for /f %%j in ("%%~i") do set "Zeile=%%i" 
15.
endlocal&set "Zeile=%Zeile:!=$#³#²#$%" 
16.
for /f %%j in ('"%temp%\LZ2LF.cmd"') do for /f %%k in ("%%~j") do set "lastSigns=%%k" 
17.
endlocal&set "lastSigns=%lastSigns:$#³#²#$=!%" 
18.
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
Bitte warten ..
Mitglied: bastla
07.02.2011 um 15:36 Uhr
... 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:
01.
set G=%temp%\GetLastWord.vbs 
02.
> %G% echo T=RTrim(Replace(CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0)).ReadAll,vbCrLf," ")) 
03.
>>%G% echo WScript.Echo Mid(T,InStrRev(T," ")+1) 
04.
for /f "delims=" %%i in ('cscript //nologo %G% "%NeuesteDatei%"') do set "Letztes=%%i"
Grüße
bastla
Bitte warten ..
Mitglied: pieh-ejdsch
07.02.2011 um 16:01 Uhr
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
Bitte warten ..
Mitglied: bastla
07.02.2011 um 16:06 Uhr
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
Bitte warten ..
Mitglied: pieh-ejdsch
07.02.2011 um 16:28 Uhr
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
Bitte warten ..
Mitglied: jeb-the-batcher
07.02.2011 um 22:00 Uhr
Hallo,

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

01.
@echo off 
02.
setlocal DisableDelayedExpansion 
03.
rem ** Linefeed erzeugen 
04.
set LF=^ 
05.
 
06.
 
07.
rem ** Zwei leere Zeile erforderlich 
08.
rem ** Letzte Zeile rausholen 
09.
for /f "usebackq tokens=*" %%i in ("%~1") do for /f %%j in ("%%~i") do set "Zeile=%%i" 
10.
 
11.
rem ** In Zeile die Spaces durch Linefeed ersetzen 
12.
setlocal EnableDelayedExpansion 
13.
for %%a in ("!LF!") do set "zeile=!zeile: =%%~a!" 
14.
 
15.
set "last=" 
16.
for /f "delims=" %%j in ("!Zeile!") do (  
17.
	if not defined last endlocal 
18.
	set "last=%%j" 
19.
20.
setlocal Enabledelayedexpansion 
21.
echo LAST="!last!"
Grüße
jeb
Bitte warten ..
Mitglied: 91183
07.02.2011 um 22:26 Uhr
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:

01.
 
02.
 
03.
--------------------------------------------------------------- 
04.
 
05.
  Kanal ID:      (('id', 1884537),) 
06.
  Kanal Name:    Kanal246 
07.
  Benutzername:       Username 
08.
  Gestartet am / um: 2011.02.06 22:12:59 
09.
--------------------------------------------------------------- 
10.
 
11.
[ 2011.02.06 22:14:19 ] Programm > Text1 
12.
[ 2011.02.06 22:15:06 ] Programm > Text2 
13.
[ 2011.02.06 22:15:11 ] User > U-Text1 
14.
[ 2011.02.06 22:15:15 ] Programm > Text3 
15.
 
Nur mal so als Beispiel.

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?

01.
@echo off & setlocal 
02.
 
03.
set pfad=%userprofile%\eigene dateien\logs\ 
04.
 
05.
set NeuesteDatei= 
06.
for /f "delims=" %%i in ('dir /b /on "%pfad%Idee*.txt" 2^>nul') do set  "NeuesteDatei=%%i" 
07.
 
08.
echo %NeuesteDatei% 
09.
 
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.
Bitte warten ..
Mitglied: 91183
07.02.2011 um 22:43 Uhr
@ 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.
Bitte warten ..
Mitglied: bastla
07.02.2011 um 22:44 Uhr
Hallo Xeno--!

Für das gepostete Beispiel sollte
01.
@echo off & setlocal 
02.
set "pfad=set pfad=%userprofile%\eigene dateien\logs\" 
03.
 
04.
pushd "%pfad%" 
05.
for /f "delims=" %%i in ('dir /b /on "Idee*.txt" 2^>nul') do set  "NeuesteDatei=%%i" 
06.
for /f "usebackq delims=" %%i in ("%NeuesteDatei%") do set "Zeile=%%i" 
07.
setlocal enabledelayedexpansion 
08.
for %%i in (!Zeile!) do set "Letztes=%%i" 
09.
endlocal & set "Letztes=%Letztes%" 
10.
popd 
11.
 
12.
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
Bitte warten ..
Mitglied: 91183
07.02.2011 um 22:52 Uhr
Hallo bastla.

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


Gruß Xeno
Bitte warten ..
Mitglied: 91183
07.02.2011 um 23:27 Uhr
@ 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
Bitte warten ..
Mitglied: bastla
07.02.2011 um 23:35 Uhr
Hallo Xeno--!

Natürlich ist die Zeile 2 falsch - 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
Bitte warten ..
Mitglied: 91183
07.02.2011 um 23:48 Uhr
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.
Bitte warten ..
Mitglied: bastla
07.02.2011 um 23:58 Uhr
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
Bitte warten ..
Mitglied: 91183
08.02.2011 um 00:21 Uhr
Es sieht so aus, als würde er jetzt zumindest die Zeile finden,
denn er gibt bei...

01.
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:

01.
echo %NeuesteDatei% 
02.
echo %Zeile% 
03.
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]
Bitte warten ..
Mitglied: bastla
08.02.2011 um 00:30 Uhr
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
Bitte warten ..
Mitglied: 91183
08.02.2011 um 00:40 Uhr
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.
Bitte warten ..
Mitglied: 91183
08.02.2011 um 01:06 Uhr
Also, habe jetzt mal den Hex-Editor befragt und er gibt mir folgendes aus:


5c23e3b2b1675b404df28322f2d01e46 - Klicke auf das Bild, um es zu vergrößern


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

01.
 
02.
 
03.
--------------------------------------------------------------- 
04.
 
05.
  Kanal ID:      (('id', 1884537),) 
06.
  Kanal Name:    Kanal246 
07.
  Benutzername:       Username 
08.
  Gestartet am / um: 2011.02.06 22:12:59 
09.
--------------------------------------------------------------- 
10.
 
11.
[ 2011.02.06 22:14:19 ] Programm > Text1 
12.
[ 2011.02.06 22:15:06 ] Programm > Text2 
13.
[ 2011.02.06 22:15:11 ] User > U-Text1 
14.
[ 2011.02.06 22:15:15 ] Programm > Text3 
15.
 
Hoffe das hilft.
Bitte warten ..
Mitglied: bastla
08.02.2011 um 01:14 Uhr
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
Bitte warten ..
Mitglied: rubberman
08.02.2011 um 01:18 Uhr
Hallo Xeno--

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

<edit TOO LATE \>
Bitte warten ..
Mitglied: 91183
08.02.2011 um 01:23 Uhr
Bitte warten ..
Mitglied: 91183
08.02.2011 um 01:25 Uhr
Alles klar. Jetzt funktioniert es, super!!!

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

Sorry, dass Ich Euch so viel Arbeit gemacht habe.


Gruß Xeno
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(3)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Variable setzen können während timeout (3)

Frage von DontFlameMeITryMyBest zum Thema Batch & Shell ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
gelöst Aktueller Besitzer der aktuellen Datei herausfinden und in Variable schreiben (11)

Frage von Peter32 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...